it-swarm-ru.tech

Вы можете заархивировать файл из командной строки, используя встроенную возможность ТОЛЬКО в Windows для архивирования файлов?

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

Это будет использоваться в неконтролируемой среде, поэтому я не могу делать предположения о наличии сторонних программных продуктов, таких как 7-Zip и т.д. Для этого необходимо использовать встроенную в Windows возможность для Zip файлы.

102
Aaron Bush

Вот решение для всех пакетных файлов (вариант моего другого ответа), которое заархивирует файл с именем c:\ue_english.txt и поместит его в C:\someArchive.Zip:

set FILETOZIP=c:\ue_english.txt

set TEMPDIR=C:\temp738
rmdir %TEMPDIR%
mkdir %TEMPDIR%
xcopy /s %FILETOZIP% %TEMPDIR%

echo Set objArgs = WScript.Arguments > _zipIt.vbs
echo InputFolder = objArgs(0) >> _zipIt.vbs
echo ZipFile = objArgs(1) >> _zipIt.vbs
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
echo wScript.Sleep 2000 >> _zipIt.vbs

CScript  _zipIt.vbs  %TEMPDIR%  C:\someArchive.Zip

pause

Доступ на запись требуется для родителя папки, хранящейся в TEMPDIR. Поскольку это часто не относится к корню диска C, TEMPDIR, возможно, придется изменить.

Доступ для записи также требуется для папки, в которой находится скрипт .bat (поскольку он генерирует файл там).

Также обратите внимание, что расширение файла для сжатого файла должно быть .Zip. Попытки использовать другое расширение могут привести к ошибке сценария. Вместо этого создайте файл .Zip и переименуйте его.

84
Peter Mortensen

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

Запустите это в окне командной строки, чтобы создать Zip-файл с именем C:\someArchive.Zip, содержащий все файлы в папке C:\test3:

CScript  Zip.vbs  C:\test3  C:\someArchive.Zip

Где файл Zip.vbs содержит:

'Get command-line arguments.
Set objArgs = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
InputFolder = FS.GetAbsolutePathName(objArgs(0))
ZipFile = FS.GetAbsolutePathName(objArgs(1))

'Create empty Zip file.
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)

Set objShell = CreateObject("Shell.Application")

Set source = objShell.NameSpace(InputFolder).Items

objShell.NameSpace(ZipFile).CopyHere(source)

'Required to let the Zip command execute
'If this script randomly fails or the Zip file is not complete, 
'just increase to more than 2 seconds
wScript.Sleep 2000

Я не проверял его на пути и имена файлов, содержащие пробелы. Это может работать, если кавычки помещаются вокруг параметров командной строки.


Как это работает: встроенная функциональность Zip в Windows (Windows XP и ​​более поздние версии?) Предоставляется через COM интерфейсы из оболочки Windows, Explorer.exe - то есть «оболочки» .Application "часть. Этот интерфейс COM можно использовать из сценария VBScript , поскольку такой сценарий может обращаться к компонентам COM. Чтобы сделать скрипт полностью автономным, он создает пустой Zip-файл для начала (можно также создать пустой Zip-файл и скопировать его в целевую систему вместе со сценарием VBScript).

VBScript был установлен по умолчанию в каждой версии Microsoft Windows для настольных компьютеров, начиная с Windows 98.

CScript.exe является частью Windows Script Host. Windows Script Host распространяется и устанавливается по умолчанию в Windows 98 и более поздних версиях Windows. Он также устанавливается, если установлен Internet Explorer 5 (или более поздняя версия).

37
Peter Mortensen

Если вы открыты для использованияPowerShell, возможности Zip доступны в .NET 2.0 (PowerShell - это .NET). Вот пример ( source ) кредит Майку Ходнику:

########################################################
# out-Zip.ps1
#
# Usage:
#    To Zip up some files:
#       ls c:\source\*.txt | out-Zip c:\target\archive.Zip $_
#
#    To Zip up a folder:
#       gi c:\source | out-Zip c:\target\archive.Zip $_
########################################################

$path = $args[0]
$files = $input

if (-not $path.EndsWith('.Zip')) {$path += '.Zip'} 

if (-not (test-path $path)) { 
  set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
} 

$ZipFile = (new-object -com Shell.application).NameSpace($path) 
$files | foreach {$zipfile.CopyHere($_.fullname)}
12
Beaner

Вы можете устранить риск тайм-аута во время сжатия, опросив наличие диалогового окна сжатия. Этот метод также обрабатывает отмену пользователем из окна сжатия.

objShell.NameSpace(ZipFile).CopyHere(source)

' Wait for compression window to open
set scriptShell = CreateObject("Wscript.Shell")
Do While scriptShell.AppActivate("Compressing...") = FALSE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop  

' Wait for compression to complete before exiting script
Do While scriptShell.AppActivate("Compressing...") = TRUE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop
7
George Yockey

Если вы сможете установить Resource Kit Tools , вы найдете инструмент командной строки под названием COMPRESS, который может создавать сжатые архивные файлы, такие как Zip.

Microsoft (R) File Compression Utility  Version 5.00.2134.1
Copyright (C) Microsoft Corp. 1990-1999.  All rights reserved.

Compresses one or more files.

COMPRESS [-r] [-d] [-z] Source Destination
COMPRESS -r [-d] [-z] Source [Destination]

  -r            Rename compressed files.
  -d            Update compressed files only if out of date.
  -zx           LZX compression.
  -z            MS-Zip compression.
  -zq[n]        Quantum compression and optional level
                (in range 1-7, default is 4).
  Source        Source file specification.  Wildcards may be used.
  Destination   Destination file | path specification.
                Destination may be a directory.
                If Source is multiple files and -r is not specified,
                Destination must be a directory.
4
cowgod
'Keep script waiting until compression is done
Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count
    WScript.Sleep 200
Loop
3
Jiří Kočara

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

Это приведет к тому, что папка назначения будет проверяться каждые 200 мс, что примерно так же быстро, как Microsoft говорит проверять наличие обновлений FS.

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
Set ZipDest = Shell.NameSpace(ZipFile)
Count=ZipDest.Items().Count
Shell.NameSpace(ZipFile).CopyHere(source_objects)
Do While Count = ZipDest.Items().Count
    wScript.Sleep 200
Loop
2
kayleeFrye_onDeck

Несколько файлов/каталогов с упрощенным кодом.

cscript Zip.vbs target.Zip sourceFile1 sourceDir2 ... sourceObjN

Zip.vbs файл

Set objArgs = WScript.Arguments
ZipFile = objArgs(0)

' Create empty Zip file and open for adding
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set Zip = CreateObject("Shell.Application").NameSpace(ZipFile)

' Add all files/directories to the .Zip file
For i = 1 To objArgs.count-1
  Zip.CopyHere(objArgs(i))
  WScript.Sleep 10000 'REQUIRED!! (Depending on file/dir size)
Next
2
Olc

Вот моя попытка обобщить встроенные возможности окон для сжатия и распаковки - https://stackoverflow.com/questions/28043589/how-can-i-compres-Zip-and-uncopress-unzip-files- and-folder-with-batch-f

с несколькими данными решениями, которые должны работать практически на каждой машине Windows.

Что касается Shell.application и WSH, то я предпочел jscript , поскольку он допускает гибридный пакетный/jscript-файл (с расширением .bat), который не требует временных файлов. Я поставил Возможности распаковать и сжать в одном файле плюс еще несколько функций.

1
npocmaka

Если в Windows 8 или Windows Server 2012 у вас есть PowerShell и .NET 4.5, вы можете сделать это:

Zip.ps1 (использование: -directory <directory to Zip up> -name <Zip name>):

param (
    [string]$directory,
    [string]$name
)

Add-Type -Assembly System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory($directory, $name, [System.IO.Compression.CompressionLevel]::Optimal, $false)

Zip.bat (если вам нужен помощник для вызова PowerShell, каталог является первым аргументом, а имя Zip вторым):

@Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"
0
Hashbrown