2010-02-19 19:46:23 +0000 2010-02-19 19:46:23 +0000
113
113

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

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

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

Ответы (12)

86
86
86
2010-02-22 17:28:45 +0000

Вот решение для всех пакетных файлов (вариация моего другого ответа), которое будет архивировать файл с именем 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 и переименуйте его.

40
40
40
2010-02-20 15:48:33 +0000

Это is возможность 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 an 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 - это часть “Shell.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 (или более поздней версии).

12
12
12
2010-02-19 21:59:36 +0000

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

########################################################
# 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)}
7
7
7
2011-11-23 00:47:36 +0000

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

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
5
5
5
2010-02-19 20:29:14 +0000

Если вы можете установить 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.
```.
3
3
3
2012-08-07 07:46:33 +0000
'Keep script waiting until compression is done
Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count
    WScript.Sleep 200
Loop
2
2
2
2017-06-07 21:53:59 +0000

Это мутация принятого ответа. Я выполняю массу задач по автоматизации на тысячах файлов одновременно, поэтому я не могу просто спать 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
2
2
2012-11-05 21:06:59 +0000

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

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
1
1
1
2015-01-22 12:31:49 +0000

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

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

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

1
1
1
2019-08-20 13:24:16 +0000

Windows 10 build 17063 или более поздняя версия комплектуется tar.exe, который способен работать с zip из командной строки.

tar.exe -xf archive.zip

или для создания архива

tar.exe -cf Test.zip Test
1
1
1
2016-08-02 11:19:52 +0000

Если в 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'"
-4
-4
-4
2013-05-31 19:54:34 +0000

Командная строка Windows теперь предоставляет компактную команду, которая, насколько я могу судить, является родной для Windows. Она должна отвечать запрошенным требованиям, если только я что-то не пропустил.

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

3
19
10
28
6