2010-10-20 07:50:38 +0000 2010-10-20 07:50:38 +0000
63
63

Tworzenie folderu .zip z linii poleceń - (Windows)

Czy możliwe jest utworzenie pliku .zip z folderu w linii poleceń, nie chcę używać żadnych zewnętrznych wykonywalnych.

Myślałem o czymś w rodzaju ‘wyślij do skompresowanego folderu’, ale nie wiem jak to zrobić…

Odpowiedzi (10)

41
41
41
2015-04-06 21:26:20 +0000

Począwszy od PowerShell 5 (luty 2016), można użyć “Compress-Archive”:

Compress-Archive -Path input.txt -DestinationPath output.zip

lub:

Compress-Archive input.txt output.zip

input.txt tutaj może być również katalog https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/compress-archive?view=powershell-5.1

7
7
7
2010-10-20 07:57:39 +0000

Nie wydaje mi się, aby istniał wiersz poleceń dla plików ZIP wbudowanych w Windows (poza compress w Server 2003 Resource Kit). Musiałbyś skorzystać z usług osoby trzeciej. Wszyscy kochają 7zip !

6
6
6
2010-10-20 08:32:39 +0000

Połączyłem ten scenariusz z kilku różnych źródeł, aby lepiej dopasować go do moich potrzeb. Skopiuj i wklej skrypt do pliku z rozszerzeniem “.vbs”. Skrypt został stworzony dla Windows XP, ale działa również w Windows 7 x64 Ultimate - nie ma gwarancji, że Windows będzie trzymał się różnych obiektów Shell, których to używa.

Zastosowanie: w polu startowym lub linii poleceń put-

"C:\zipper.vbs" "C:\folderToZip\" "C:\mynewzip.zip"

Ścieżka do skryptu, folder źródłowy, plik zip do wykonania (dołącz .zip na końcu).

Nie skopiuje pustych folderów, więc należy być ostrożnym.

Oto kod vbs —

Set Args = Wscript.Arguments
source = Args(0)
target = Args(1)

' make sure source folder has \ at end
If Right(source, 1) <> "\" Then
    source = source & "\"
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set zip = objFSO.OpenTextFile(target, 2, vbtrue)
' this is the header to designate a file as a zip
zip.Write "PK" & Chr(5) & Chr(6) & String( 18, Chr(0) )
zip.Close
Set zip = nothing

wscript.sleep 500

Set objApp = CreateObject( "Shell.Application" )
intSkipped = 0

' Loop over items within folder and use CopyHere to put them into the zip folder
For Each objItem in objApp.NameSpace( source ).Items
    If objItem.IsFolder Then
        Set objFolder = objFSO.GetFolder( objItem.Path )
        ' if this folder is empty, then skip it as it can't compress empty folders
        If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then
            intSkipped = intSkipped + 1
        Else
            objApp.NameSpace( target ).CopyHere objItem
        End If
    Else
        objApp.NameSpace( target ).CopyHere objItem
    End If
Next

intSrcItems = objApp.NameSpace( source ).Items.Count
wscript.sleep 250

' delay until at least items at the top level are available
Do Until objApp.NameSpace( target ).Items.Count + intSkipped = intSrcItems
    wscript.sleep 200
Loop

'cleanup
Set objItem = nothing
Set objFolder = nothing
Set objApp = nothing
Set objFSO = nothing
4
4
4
2018-07-04 11:29:13 +0000

Wyobraź sobie, że chcesz skompresować ten sam folder, który znajduje się na Command Prompt BEZ otwierania okna powershell:

powershell Compress-Archive . publish.zip
2
2
2
2018-01-18 22:50:18 +0000

Oto inny pomysł, z 4 różnych źródeł; nie moje pomysły, ale skompilowałem je tak, aby działały dla mnie

<!-- : Begin batch script
@each off

set sourceFolder="c:\test"
set destZip="%userprofile%\desktop\example.zip"

cscript //nologo "%~f0?.wsf" //job:exewsh %sourceFolder% %destZip%

exit /b
GOTO:EOF
----- Begin wsf script --->
<package><job id="exewsh"><script language="VBScript">
'Get command-line arguments.
Set objArgs = WScript.Arguments
InputFolder = objArgs(0)
ZipFile = 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!
wScript.Sleep 2000
</script></job>
</package>
2
2
2
2016-11-30 12:19:08 +0000

Możliwe jest uruchomienie skryptu PowerShell z BAT. Plik Bat otrzymuje ścieżkę do dir, który ma być zipowany i nazwę pliku zip jako parametry.

@echo off
setlocal

rem First parameter - path to dir to be zipped
rem Second parameter- zip file name
set sourceDir=%1
set zipFile=%2

rem Create PowerShell script
echo Write-Output 'Custom PowerShell profile in effect!' > %~dp0TempZipScript.ps1
echo Add-Type -A System.IO.Compression.FileSystem >> %~dp0TempZipScript.ps1
echo [IO.Compression.ZipFile]::CreateFromDirectory('%sourceDir%','%~dp0%zipFile%') >> %~dp0TempZipScript.ps1

rem Execute script with flag "-ExecutionPolicy Bypass" to get around ExecutionPolicy
PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dp0TempZipScript.ps1'"
del %~dp0TempZipScript.ps1
endlocal
1
1
1
2013-11-15 04:21:10 +0000

Oto świetny link, który pokazuje jak zipować plik przy użyciu natywnych poleceń Windows. Czy można zipować plik z wiersza poleceń używając TYLKO wbudowanych możliwości Windows do zipowania plików?

Testowałem go z katalogiem zawierającym wiele zagnieżdżonych plików i folderów i działał doskonale. Wystarczy postępować zgodnie z formatem linii poleceń.

Istnieje również sposób na rozpakowanie plików poprzez linię poleceń, którą również znalazłem. W jeden sposób, po prostu otwiera się okno eksploratora pokazujące zawartość pliku w formacie zip. Niektóre z nich używają także Javy, która niekoniecznie jest natywna dla okien, ale jest tak powszechna, że prawie się tak wydaje. Czy Windows 7 ma domyślnie rozpakowany w linii poleceń? https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-using-the-command-line

1
1
1
2017-08-16 06:41:05 +0000

Jest to stare pytanie, ale jego znaczenie jest nadal aktualne.

Windows oczywiście ma swój własny algorytm kompresji wbudowany do korzystania z plików zip, ale, to naprawdę działa słabo w porównaniu z 7zip open source produktu znaleźć tutaj http://www.7-. zip.org/

Inne omówiły już różne metody wykorzystania wbudowanych w Windows funkcji, moje rozwiązanie wymaga zainstalowania dodatkowego oprogramowania.

7Zip obsługuje szeroką gamę plików, w tym ZIP, RAR, CAB i ISO oraz własny format 7z.

Możesz zobaczyć pomoc z linii poleceń: C:\“Pliki programu\7-Zip\7z.exe” –help

do prostego dodania do archiwum zip:

“C:\"Pliki programu\7-Zip\7z.exe” plik.zip c:\ścieżka

1
1
1
2015-01-07 14:22:03 +0000

Zamieszczę coś związanego z odpowiedzią WSkids ponieważ niestety nie mogę użyć funkcji komentarza.

Użycie metody CopyHere() w VBS wprowadza kilka kwestii. Jedną z nich jest to, że metoda ta wraca natychmiast, podczas gdy proces kopiowania rozpoczyna się w tle, podczas gdy wiele wywołań CopyHere() będzie zakłócać się nawzajem i ZIP nie zostanie utworzony poprawnie. Potrzebna jest tutaj pętla oczekiwania, aby to naprawić. Moja pętla oczekiwania jest oparta na odpowiedzi na podobny problem zamieszczonej tutaj .

Tutaj jest zaktualizowana wersja, która naprawia błąd “Object required” zgłoszony przez pihentagy . Jest to problem z czasem, ponieważ nowo utworzony plik ZIP jest dołączony do kolekcji Items, gdy skrypt jest wykonywany na szybkich maszynach.

set Args = WScript.Arguments
source = Args(0)
' remove trailing slashes as we add slashes when needed later
while Right(source, 1) = "\"
    source = Mid(source, 1, Len(source) - 1)
wend

target = Args(1)

' create empty ZIP file
set fso = CreateObject("Scripting.FileSystemObject")
set zip = fso.OpenTextFile(target, 2, vbtrue)
' write ZIP header, this ensures that Windows recognizes the file as "ZIP Folder"
zip.Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0))
zip.Close
set zip = nothing
set fso = nothing

' copy files to ZIP file
set app = CreateObject("Shell.Application")

set sourceFolderObj = app.NameSpace(source)
set targetFolderObj = app.NameSpace(target)

for each item in sourceFolderObj.Items
  itemPath = source & "\" & item.Name

  copyItem = false

  ' ZIP file is included in Items collection and is recognized as folder, thus skip it to avoid script errors
  if itemPath <> target then
    if item.IsFolder then
      if item.GetFolder.Items().Count = 0 then
        ' folder is empty, skip it as empty folders can't be compressed
      else
        copyItem = true
      end if
    else
      copyItem = true
    end if
  end if

  if copyItem then
    targetFolderObj.CopyHere item

    ' wait until the file appears in the ZIP file, 
    ' this is needed because CopyHere() returns immediately after starting an asynchronous copy process 
    ' (starting multiple asynchronous copy will not work as it causes error messages, an invalid ZIP file, ...)
    while (targetFolderObj.ParseName(item.Name) is nothing)
      WScript.Sleep 1
    wend
  end If
next

set targetFolderObj = nothing
set sourceFolderObj = nothing
set app = nothing
1
1
1
2015-01-22 12:27:53 +0000

Oto moja próba podsumowania wbudowanych możliwości okien 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.