Was muss in diesem Archivierungsskript geändert werden, um nur bestimmte Dateitypen zu archivieren?

430
kayleeFrye_onDeck

Ich habe dieses Skript basierend auf früheren Antworten von Superuser erstellt, muss aber jetzt nur bestimmte Dateitypen archivieren. Ich habe herumgespielt, als ich versuchte, Platzhalter zu verwenden, aber nichts, was ich versuchte, schien zu haften.

Wenn ich dieses Skript so ändern wollte, dass es nach bestimmten Dateitypen und nicht nach allen Dateisystemobjekten filtert, was muss wie geändert werden? Wenn ich beispielsweise nur DLL-Dateien oder DLL- und EXE-Dateien archivieren wollte, wie würde sich das ändern?

'To use this at command-line, call `CScript.exe zip_it.vbs SourceDirectory PathToOutputZipFileIncludingDotZipExt` Set parameters = WScript.Arguments Set FS = CreateObject("Scripting.FileSystemObject") SourceDir = FS.GetAbsolutePathName(parameters(0)) ZipFile = FS.GetAbsolutePathName(parameters(1)) CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar) Set shell = CreateObject("Shell.Application") Set source_objects = shell.NameSpace(SourceDir).Items shell.NameSpace(ZipFile).CopyHere(source_objects) wScript.Sleep 400 
0

1 Antwort auf die Frage

1
shawn

Sie können einen Filter verwenden. Die Magie ist hier:

SHCONTF_NONFOLDERS = 64 colFolderItems.Filter SHCONTF_NONFOLDERS, "*.ext" 

Hier steht es in Zusammenhang mit Ihrem Code:

'To use this at command-line, call `CScript.exe zip_it.vbs SourceDirectory PathToOutputZipFileIncludingDotZipExt "file.pattern"` Set parameters = WScript.Arguments Set FS = CreateObject("Scripting.FileSystemObject") SourceDir = FS.GetAbsolutePathName(parameters(0)) ZipFile = FS.GetAbsolutePathName(parameters(1)) FileFilter = parameters(2) CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar) Set shell = CreateObject("Shell.Application") Set source_objects = shell.NameSpace(SourceDir).Items SHCONTF_NONFOLDERS = 64 source_objects.Filter SHCONTF_NONFOLDERS, FileFilter shell.NameSpace(ZipFile).CopyHere(source_objects) wScript.Sleep 400 

Dies kann mit "* .txt" aufgerufen werden, um nur Textdateien auszuwählen, oder "* .exe", um nur Exe-Dateien zu sammeln. Beachten Sie auch, dass es nicht gut läuft, wenn kein Dateifilter enthalten ist.

Ihr Code ist jedoch so konzipiert, dass er die ZIP-Datei jedes Mal neu erstellt. Sie müssen also zunächst prüfen, ob die Datei vorhanden ist, wenn Sie wiederholt nach zusätzlichen Dateitypen aufrufen möchten. Diese Änderung macht das:

If Not FS.FileExists (ZipFile) Then CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar) End If 

Dies hat den Nebeneffekt, dass eine Eingabeaufforderung zum Überschreiben eingeblendet wird (und fast sofort ausgeblendet wird), wenn die Dateien bereits in der ZIP-Datei vorhanden sind. Mit dieser Änderung könnten Sie Folgendes tun:

cscript //nologo zip_it.vbs thefolder thefile.zip "*.txt" cscript //nologo zip_it.vbs thefolder thefile.zip "*.doc" 

Es kann geändert werden, um Dateitypen oder Erweiterungen zu durchlaufen und alle Dateien zu sammeln, wenn kein Filter vorhanden ist.

'To use this at command-line, call `CScript.exe zip_it.vbs SourceDirectory PathToOutputZipFileIncludingDotZipExt "file.pattern" "file2.pattern"` Set parameters = WScript.Arguments Set FS = CreateObject("Scripting.FileSystemObject") SourceDir = FS.GetAbsolutePathName(parameters(0)) ZipFile = FS.GetAbsolutePathName(parameters(1)) SHCONTF_NONFOLDERS = 64  If Not FS.FileExists (ZipFile) Then CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar) End If  Set shell = CreateObject("Shell.Application")  If parameters.Count > 2 Then For lParams = 2 to (parameters.Count-1) FileFilter = parameters(lParams) Set source_objects = shell.NameSpace(SourceDir).Items source_objects.Filter SHCONTF_NONFOLDERS, FileFilter shell.NameSpace(ZipFile).CopyHere(source_objects) wScript.Sleep 400 Next Else Set source_objects = shell.NameSpace(SourceDir).Items shell.NameSpace(ZipFile).CopyHere(source_objects) wScript.Sleep 400 End If 

Das könnte man so nennen:

cscript //nologo zip_it.vbs thefolder thefile.zip "*.doc" "*.txt" 
Ich mag deine Änderungen, aber leider fällt sie etwas zu kurz. Zum einen können Dateifilter nur dann gehandhabt werden, wenn dieser bestimmte Dateityp direkt im als Parameter gesendeten Quellverzeichnis vorhanden ist. Zum anderen findet es, selbst wenn dies der Fall ist, keine in Unterverzeichnissen. Interessanterweise scheint keines unserer Skripts riesige Verzeichnisse rekursiv zu behandeln. nur kleine, die nerven! Ich wusste nicht, dass meine so schwach war :( kayleeFrye_onDeck vor 5 Jahren 0