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

Если бы я хотел изменить этот скрипт для фильтрации по определенным типам файлов вместо всех объектов файловой системы, что нужно изменить и как? Например, если бы я хотел архивировать только 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

1 ответ1

1

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

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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .