Erstellen Sie einen ZIP-Ordner über die Befehlszeile - (Windows)


57

Ist es möglich, eine ZIP-Datei aus einem Ordner in der Befehlszeile zu erstellen, möchte ich keine ausführbare Datei eines Drittanbieters verwenden.

Ich habe mir etwas wie "In komprimierten Ordner senden" überlegt, aber ich weiß nicht, wie ich das machen soll ...


2
Das Windows Resource Kit enthält ein Tool namens compress.exe.
ho1

2
Hier ist ein Link zu einer ServerFault-Frage, die genau dies behandelt: serverfault.com/questions/39071/…
ho1

Antworten:



7

Ich glaube nicht, dass es eine Befehlszeile für ZIP-Dateien gibt, die in Windows integriert sind (anders als compressin Server 2003 Resource Kit). Sie müssten einen Dritten benutzen. Jeder liebt 7zip !


6

Ich habe dieses Skript aus verschiedenen Quellen kombiniert, um meinen Bedürfnissen besser zu entsprechen. Kopieren Sie das Skript und fügen Sie es in eine Datei mit der Erweiterung ".vbs" ein. Das Skript wurde ursprünglich für Windows XP erstellt, funktioniert aber auch unter Windows 7 x64 Ultimate - es gibt keine Garantie dafür, dass Windows die verschiedenen verwendeten Shell-Objekte beibehält.

Verwendung: In der Run-Box oder in der Kommandozeile

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

Pfad zum Skript, Quellordner, zu erstellende Zip-Datei (am Ende mit .zip).

Leere Ordner werden nicht kopiert, seien Sie also vorsichtig.

Hier ist der VBS-Code ---

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

1
Sieht vielversprechend aus, aber ich habe einen "Object required: 'objApp.NameSpace (...)' - Fehler in Zeile 16
Mittwoch,

Ich habe das gleiche Problem. Der obige Code funktioniert nicht oder benötigt ein paar zusätzliche Dinge im System, die das Poster vergessen hat zu erwähnen.
Shaamaan

Es verwendet WScript (VBS-Umgebung) und mehrere Shell-Objekte. Alle wurden standardmäßig in Windows XP (Business?) Und Win 7 Ultimate x64 installiert. Vielleicht sind sie länger für Win8 da?
WSkid

2

Es ist möglich, PowerShell-Skripte über BAT auszuführen. Bat-Datei-Empfangspfad zum zu komprimierenden Verzeichnis und Name der komprimierten Datei als Parameter.

@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
Aber was wäre der Vorteil dieses Ansatzes? Warum nicht einfach das PowerShell-Skript in eine feste Datei schreiben und Parameter akzeptieren lassen?
Seth

Ich habe alle anderen Lösungen ausprobiert. Dies ist die einzige ausfallsichere Lösung, die einwandfrei funktioniert. Der wichtigste Vorteil ist die Verwendung der nativen Befehle von Powershell, und es ist nicht erforderlich, das VBScript der alten Technologie zu erstellen.
Desmati

Dies funktionierte für mich auf einem alten Unternehmens-Windows7-Laptop im Jahr 2019.
simbo1905

1

Hier ist ein großartiger Link, der zeigt, wie eine Datei mit nativen Windows-Befehlen komprimiert wird.

Können Sie eine Datei über die Eingabeaufforderung komprimieren, indem Sie NUR die in Windows integrierte Funktion zum Komprimieren von Dateien verwenden?

Ich habe es mit einem Verzeichnis getestet, das mehrere verschachtelte Dateien und Ordner enthält, und es hat einwandfrei funktioniert. Folgen Sie einfach dem Format der Befehlszeile.

Es gibt auch eine Möglichkeit, die Dateien über die Kommandozeile zu entpacken, die ich ebenfalls gefunden habe. Auf eine Weise wird nur ein Explorer-Fenster geöffnet, in dem der Inhalt der komprimierten Datei angezeigt wird. Einige von ihnen verwenden auch Java, das nicht unbedingt für Windows typisch ist, aber so verbreitet ist, dass es fast so scheint.

Entpackt Windows 7 standardmäßig über die Befehlszeile?

https://stackoverflow.com/questions/1021557/how-to-unzip-a-file- using-the-command-line


3
Sie sollten die Anweisungen in Ihre Antwort aufnehmen. Wenn die Links abgestanden sind, ist Ihre Antwort wertlos ...
MoonSire

1

Dies ist eine alte Frage, aber ihre Relevanz ist immer noch aktuell.

Windows hat natürlich einen eigenen Komprimierungsalgorithmus für die Verwendung von ZIP-Dateien, der jedoch im Vergleich zu dem 7zip-Open-Source-Produkt, das Sie hier finden http://www.7-zip.org/ , sehr schlecht abschneidet.

Andere haben bereits verschiedene Methoden für die Verwendung der eingebauten Windows-Funktionen besprochen. Meine Lösung erfordert die Installation der zusätzlichen Software.

7Zip unterstützt eine Vielzahl von Dateien, einschließlich ZIP, RAR, CAB und ISO sowie das eigene 7Z-Format.

Sie können die Befehlszeilenhilfe anzeigen: "C: \ Programme \ 7-Zip \ 7z.exe" --help

So führen Sie ein einfaches Add-to-Zip-Archiv durch:

"C: \ Programme \ 7-Zip \ 7z.exe" a filename.zip c: \ path


1

Hier ist eine andere Idee aus 4 verschiedenen Quellen; Nicht meine Ideen, aber ich habe sie zusammengestellt, damit sie für mich funktionieren

<!-- : 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
Willkommen bei Super User ! Dies ist offensichtlich ein kompliziertes Skript. Könnten Sie erklären, was es macht und wie man es benutzt?
Jpaugh

1

Stellen Sie sich vor, Sie möchten denselben Ordner wie in der Eingabeaufforderung komprimieren, OHNE ein Powershell-Fenster zu öffnen:

powershell Compress-Archive . publish.zip

Das war nicht meine Absicht, aber es wird jetzt für mich funktionieren. Das ist ein nützlicher Trick.
Bballdave025

0

Ich werde etwas im Zusammenhang mit der Antwort von WSkids posten , da ich die Kommentarfunktion leider nicht verwenden kann.

Die Verwendung der CopyHere () -Methode in VBS führt zu mehreren Problemen. Eines dieser Probleme ist, dass die Methode sofort zurückgegeben wird, während der Kopiervorgang im Hintergrund gestartet wird, während sich mehrere CopyHere () -Aufrufe gegenseitig stören und die ZIP-Datei nicht korrekt erstellt wird. Hier wird eine Warteschleife benötigt, um das zu beheben. Meine Warteschleife basiert auf einer Antwort auf ein ähnliches Problem, das hier veröffentlicht wurde .

Hier ist eine aktualisierte Version, die den von pihentagy gemeldeten Fehler "Objekt erforderlich" behebt . Dies ist ein Zeitproblem, da die neu erstellte ZIP-Datei in der Items-Auflistung enthalten ist, wenn das Skript auf schnellen Computern ausgeführt wird.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.