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

Czy można zipować plik z wiersza poleceń, używając TYLKO wbudowanych możliwości systemu Windows do zipowania plików?

Mam plik wsadowy, który wyświetla plik tekstowy. Pomyślałem, że byłoby miło, gdybym mógł go również zipować.

Zostanie on użyty w niekontrolowanym środowisku, więc nie mogę zakładać obecności oprogramowania innych firm, takiego jak 7-Zip , itd. W tym celu należy wykorzystać wbudowaną teraz w Windows możliwość zamykania plików w formacie .zip.

Odpowiedzi (12)

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

Oto rozwiązanie dla wszystkich plików wsadowych (wariacja mojej innej odpowiedzi), które zapakuje plik o nazwie c:\ue_english.txt i umieści go w 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

Wymagany jest dostęp do zapisu do nadrzędnego folderu przechowywanego w TEMPDIR. Ponieważ często nie ma to miejsca w przypadku głównego dysku, C TEMPDIR może wymagać zmiany.

Dostęp do zapisu jest również wymagany dla folderu, w którym znajduje się skrypt .bat (ponieważ generuje on tam plik).

Należy również pamiętać, że rozszerzenie pliku skompresowanego musi być .zip. Próby użycia innego rozszerzenia mogą spowodować błąd skryptu. Zamiast tego, wygeneruj plik .zip i zmień jego nazwę.

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

Jest to is możliwość zipowania plików bez instalacji dodatkowego oprogramowania (testowałem go). Rozwiązanie jest następujące:

Uruchom to w oknie wiersza poleceń, aby utworzyć plik ZIP o nazwie C:\someArchive.zip zawierający wszystkie pliki w folderze C:\test3:

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

Gdzie plik zip.vbs zawiera:

' 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

Nie testowałem go dla ścieżek i nazw plików zawierających spacje. Może zadziałać, jeśli wokół parametrów wiersza poleceń zostaną umieszczone cudzysłowy.

  • *

Jak to działa: wbudowana funkcja zip w Windows (Windows XP i nowszy?) jest wyeksponowana poprzez interfejsy COM z powłoki Windows, explorer.exe - czyli części “Shell.Application”. Ten interfejs COM może być używany ze skryptu VBScript , ponieważ taki skrypt ma dostęp do komponentów COM. Aby skrypt był w pełni autonomiczny, tworzy pusty plik ZIP do uruchomienia (można również utworzyć pusty plik ZIP i skopiować go do systemu docelowego wraz ze skryptem VBScript).

VBScript jest domyślnie instalowany w każdym wydaniu desktopu Microsoft Windows od Windows 98.

CScript.exe jest częścią Windows Script Host . Windows Script Host jest domyślnie dystrybuowany i instalowany na Windows 98 i późniejszych wersjach Windows. Jest on również instalowany jeśli Internet Explorer 5 (lub późniejsza wersja) jest zainstalowany.

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

Jeśli jesteś otwarty na używanie * PowerShell **, możliwości zip są dostępne w .NET 2.0 (PowerShell jest .NET). Oto przykład źródło ) credit to Mike 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)}
7
7
7
2011-11-23 00:47:36 +0000

Można wyeliminować ryzyko przesunięcia w czasie podczas kompresji poprzez zapytanie o istnienie okna dialogowego kompresji. Metoda ta obsługuje również anulowanie użytkownika z okna kompresji.

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

Jeśli jesteś w stanie zainstalować Resource Kit Tools , znajdziesz narzędzie wiersza poleceń o nazwie COMPRESS, które może tworzyć skompresowane pliki archiwalne jak 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

Jest to mutacja przyjętej odpowiedzi. Robię tonę zadań automatyzacji na tysiącach plików naraz, więc nie mogę po prostu spać przez 2 sekundy i nie dbać o to. Uzyskałem obchód tutaj , który jest podobny do odpowiedzi Jiříego Kočary tutaj .

Spowoduje to, że folder docelowy będzie pingowany co 200ms, czyli mniej więcej tak szybko, jak mówi Microsoft, aby sprawdzić, czy nie ma aktualizacji 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

Wiele plików / katalogów z uproszczonym kodem.

cscript zip.vbs target.zip sourceFile1 sourceDir2 ... sourceObjN

plik 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

Oto moja próba podsumowania wbudowanych możliwości windows do kompresji i dekompresji - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders-with-batch-f

z kilkoma podanymi rozwiązaniami, które powinny działać na prawie każdej maszynie windowsowej.

W odniesieniu do shell.application i WSH preferowałem jscript ponieważ pozwala on na hybrydowy plik wsadowy/skryptowy (z rozszerzeniem .bat), który nie wymaga plików tymczasowych.Umieściłem możliwości rozpakowania i zip w jednym pliku plus kilka innych funkcji.

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

Windows 10 build 17063 lub nowszy jest połączony z tar.exe, który może pracować z zamkiem błyskawicznym z linii poleceń.

tar.exe -xf archive.zip

lub do tworzenia archiwów

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

Jeśli na Windows 8 lub Windows Server 2012 będziesz miał PowerShell i .NET 4.5 więc możesz to zrobić:

zip.ps1 (użycie: -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 (jeśli potrzebujesz pomocnika do wywołania PowerShella dla Ciebie, katalog jest pierwszym argumentem, a nazwa zip druga):

@Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"
-4
-4
-4
2013-05-31 19:54:34 +0000

Wiersz poleceń Windows dostarcza teraz kompaktowe polecenie, które, o ile mogę powiedzieć, jest natywne dla Windows. To powinno spełniać wymagania, o ile czegoś nie przeoczyłem.