Что необходимо изменить в этом сценарии архивации, чтобы архивировать только файлы определенных типов?

361
kayleeFrye_onDeck

Я сделал этот скрипт на основе прошлых ответов от суперпользователя, но теперь нужно архивировать только определенные типы файлов. Я бездельничал, пытаясь использовать подстановочные знаки, но ничего, что я пробовал, казалось, не прилипало.

Если бы я хотел изменить этот скрипт для фильтрации по определенным типам файлов вместо всех объектов файловой системы, что нужно изменить и как? Например, если бы я хотел архивировать только DLL-файлы или DLL & EXE-файлы, как бы это изменилось?

'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 ответ на вопрос

1
shawn

Вы можете использовать фильтр. Волшебство здесь:

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

Вот это в контексте с вашим кодом:

'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 

Это можно вызвать с помощью «* .txt», чтобы выбрать только текстовые файлы, или «* .exe», чтобы собрать только исполняемые файлы. Также обратите внимание, что он не играет хорошо, если не включен фильтр файлов.

Тем не менее, ваш код предназначен для повторного создания ZIP-файла каждый раз, поэтому вам нужно сначала проверить наличие файла, если вы хотите повторно вызывать дополнительные типы файлов. Это изменение делает это:

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

Это имеет побочный эффект - выдает (и почти сразу же скрывает) приглашение перезаписи, если файлы уже существуют в zip-файле. С этим изменением вы можете сделать это:

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

Его можно изменить, чтобы перебирать типы файлов или расширения и собирать все файлы, если нет фильтра, например:

'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 

Это можно назвать так:

cscript //nologo zip_it.vbs thefolder thefile.zip "*.doc" "*.txt" 
Мне нравятся ваши изменения, но, к сожалению, как написано, это немного не хватает. С одной стороны, он может обрабатывать файловые фильтры только в том случае, если этот конкретный тип файла существует непосредственно в исходном каталоге, отправляемом в качестве параметра. С другой стороны, даже если это так, он не найдет ничего в подкаталогах. Интересно, что ни один из наших скриптов, кажется, не обрабатывает огромные каталоги рекурсивно; только маленькие, что беспокоит! Я не понимал, что мой был так слаб :( kayleeFrye_onDeck 5 лет назад 0

Похожие вопросы