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

Maak een .zip-map aan vanaf de opdrachtregel - (Windows)

Is het mogelijk om een .zip-bestand aan te maken vanuit een map in de opdrachtregel, dan wil ik geen gebruik maken van een uitvoerbaar bestand van een derde partij.

Ik dacht zoiets als ‘verzenden naar een gecomprimeerde map’ maar ik weet niet hoe het moet…

Antwoorden (10)

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

Vanaf PowerShell 5 (februari 2016) kunt u gebruik maken van “Compress-Archive”:

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

of: Compress-Archive input.txt output.zip

input.txt kan hier ook een directory zijn 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

Ik denk niet dat er een opdrachtregel is voor ZIP-bestanden die in Windows zijn ingebouwd (Anders dan compress in Server 2003 Resource Kit). Je zou een derde partij moeten gebruiken. Iedereen houdt van 7zip !

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

Ik heb dit script uit verschillende bronnen gecombineerd om beter aan mijn behoeften te voldoen. Kopieer en plak het script in een bestand met de extensie “.vbs”. Het script is oorspronkelijk gemaakt voor Windows XP, maar het werkt ook in Windows 7 x64 Ultimate - geen garantie dat Windows de verschillende Shell objecten die dit gebruikt zal bewaren.

Gebruik: in de run box of commandoregel put-

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

Path to script, bron map, zip bestand te maken (inclusief .zip op het einde).

Het zal geen lege mappen kopiëren dus wees voorzichtig.

Hier is de 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
4
4
4
2018-07-04 11:29:13 +0000

Stel je voor dat je dezelfde map wilt comprimeren die je op Command Prompt staat ZONDER dat je een powershell-venster opent:

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

Hier is een ander idee, uit 4 verschillende bronnen; niet mijn ideeën, maar ik heb ze samengesteld om het voor mij te laten werken

<!-- : 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

Het is mogelijk om PowerShell script van BAT te draaien. Bat-bestand ontvangen pad naar dir om gezipt te worden en zip-bestandsnaam als parameters.

@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

Hier is een geweldige link die laat zien hoe je een bestand kunt zipen met windows native commando’s. Kun je een bestand zipen van de opdrachtprompt met behulp van ALLEEN Windows’ ingebouwde mogelijkheid om bestanden te zipen? Ik heb het getest met een map met meerdere genestelde bestanden en mappen en het werkte perfect. Volg gewoon het formaat van de opdrachtregel.

Er is ook een manier om de bestanden uit te pakken via de opdrachtregel die ik ook gevonden heb. Een manier is om een verkenningsvenster te openen dat laat zien wat de inhoud van het gezipte bestand is. Sommige maken ook gebruik van Java, dat niet noodzakelijkerwijs in Windows wordt gebruikt, maar zo vaak voorkomt dat het bijna zo lijkt. Heeft Windows 7 standaard een unzip op de opdrachtregel geïnstalleerd? https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-using-the-command-line

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

Dit is een oude vraag, maar de relevantie ervan is nog steeds actueel.

Windows heeft natuurlijk zijn eigen compressie-algoritme ingebouwd voor het gebruik van zip-bestanden, maar het presteert echt slecht in vergelijking met het 7zip open source product dat hier te vinden is http://www.7- zip.org/

Anderen hebben al verschillende methoden besproken voor het gebruik van de ingebouwde windows functies, mijn oplossing vereist de installatie van de extra software.

7Zip ondersteunt een breed scala aan bestanden, waaronder ZIP, RAR, CAB en ISO en het eigen 7z-formaat.

U kunt de commandoregel help bekijken: “C:\Program Files\7-Zip\7z.exe” –help

om een simpele toevoeging aan zip archief uit te voeren:

“C:\Programme Files\7-Zip\7z.exe” een bestandsnaam.zip c:\path

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

Ik zal iets plaatsen met betrekking tot WSkids antwoord omdat ik helaas de commentaar functie niet kan gebruiken.

Met de CopyHere() methode in VBS introduceert u een aantal zaken. Een van deze problemen is dat de methode onmiddellijk terugkeert terwijl het kopieerproces op de achtergrond begint, terwijl meerdere CopyHere() calls elkaar zullen storen en de ZIP niet correct zal worden aangemaakt. Een wachtlus is hier nodig om dat op te lossen. Mijn wachtlus is gebaseerd op een antwoord op een soortgelijk probleem dat is gepost hier .

Hier is een bijgewerkte versie die de door pihentagy gerapporteerde fout “Object required” herstelt. Het is een timingprobleem omdat het nieuw aangemaakte ZIP-bestand wordt opgenomen in de Items-collectie wanneer het script wordt uitgevoerd op snelle machines.

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

Hier is een poging om de ingebouwde mogelijkheden van windows voor compressie en uncompressie samen te vatten - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders-with-batch-f

met een paar gegeven oplossingen die op bijna elke Windows machine zouden moeten werken.