Можно ли архивировать файл из командной строки, используя только встроенные возможности Windows для zip-файлов?

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

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

13
задан Peter Mortensen
10.02.2023 8:49 Количество просмотров материала 3254
Распечатать страницу

11 ответов

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

81
отвечен Peter Mortensen 2023-02-11 16:37

It 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 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 , исследователь.exe-то есть "оболочка".Прикладная часть. Этот COM-интерфейс можно использовать из VBScript сценарий, потому что такой скрипт может обращаться к компонентам COM. Чтобы сделать скрипт полностью автономным, он создает пустой ZIP-файл для начала работы (можно также создать пустой ZIP-файл скопируйте его в целевую систему вместе со сценарием VBScript).

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

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

35
отвечен Peter Mortensen 2023-02-11 18:54

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

########################################################
# 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)}
11
отвечен Beaner 2023-02-11 21:11

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

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 2023-02-11 23:28

Если вы можете установить Набор Ресурсов Инструменты, вы найдете инструмент командной строки сжатие, которая может создавать сжатые архивы, такие как 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 2023-02-12 01:45
'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 2023-02-12 04:02

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

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 2023-02-12 06:19

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

это вызовет папку назначения для проверки связи каждые 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 2023-02-12 08:36

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

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

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

1
отвечен npocmaka 2023-02-12 10:53

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

молния.пс1 (Использование: -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.летучая мышь (если вам нужен помощник, чтобы вызвать PowerShell для вас, каталог первый аргумент и имя zip второй):

@Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"
0
отвечен Hashbrown 2023-02-12 13:10

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

-5
отвечен user228211 2023-02-12 15:27

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

batch
command-line
windows
zip
Вверх