È possibile creare un file .zip da una cartella nella riga di comando, non voglio usare alcun eseguibile di terze parti.
Stavo pensando a qualcosa come "invia a cartella compressa" ma non so come farlo ...
È possibile creare un file .zip da una cartella nella riga di comando, non voglio usare alcun eseguibile di terze parti.
Stavo pensando a qualcosa come "invia a cartella compressa" ma non so come farlo ...
Risposte:
A partire da PowerShell 5 (febbraio 2016), è possibile utilizzare "Compress-Archive":
Compress-Archive -Path input.txt -DestinationPath output.zip
O:
Compress-Archive input.txt output.zip
http://msdn.microsoft.com/powershell/reference/5.0/microsoft.powershell.archive/compress-archive
Non penso che ci sia una riga di comando per i file ZIP integrati in Windows (diverso da compress
Server 2003 Resource Kit). Dovresti usare una terza parte. Tutti adorano 7zip !
Ho combinato questo script da diverse fonti per soddisfare meglio le mie esigenze. Copia e incolla lo script in un file con l'estensione ".vbs". Lo script è stato originariamente creato per Windows XP, ma funziona anche con Windows 7 x64 Ultimate - nessuna garanzia se Windows manterrà i vari oggetti Shell utilizzati.
Utilizzo: nella casella Esegui o nella riga di comando put-
"C:\zipper.vbs" "C:\folderToZip\" "C:\mynewzip.zip"
Percorso dello script, cartella di origine, file zip da creare (includere .zip alla fine).
Non copierà le cartelle vuote, quindi fai attenzione.
Ecco il codice 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
È possibile eseguire lo script PowerShell da BAT. Il file bat riceve il percorso della directory da comprimere e il nome del file zip come parametri.
@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
Ecco un ottimo link che mostra come comprimere un file usando i comandi nativi di Windows.
L'ho provato con una directory contenente più file e cartelle nidificati e ha funzionato perfettamente. Segui il formato della riga di comando.
C'è anche un modo per decomprimere i file tramite riga di comando che ho trovato pure. In un modo, apre semplicemente una finestra di Explorer che mostra qual è il contenuto del file zippato. Alcuni di questi usano anche Java che non è necessariamente nativo di Windows ma è così comune che sembra quasi così.
Windows 7 ha decompresso nella riga di comando installata per impostazione predefinita?
https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-using-the-command-line
Questa è una vecchia domanda, ma la sua rilevanza è ancora attuale.
Windows ovviamente ha il suo algoritmo di compressione integrato per l'utilizzo dei file zip, ma, funziona davvero male rispetto al prodotto open source 7zip trovato qui http://www.7-zip.org/
Altri hanno già discusso di vari metodi per utilizzare le funzioni di Windows integrate, la mia soluzione richiede l'installazione di software aggiuntivo.
7Zip supporta una vasta gamma di file, tra cui ZIP, RAR, CAB e ISO ed è proprio formato 7z.
È possibile visualizzare la guida della riga di comando: "C: \ Programmi \ 7-Zip \ 7z.exe" --help
per eseguire una semplice aggiunta all'archivio zip:
"C: \ Programmi \ 7-Zip \ 7z.exe" a nomefile.zip c: \ percorso
Ecco un'altra idea, da 4 fonti diverse; non le mie idee, ma le ho compilate per farlo funzionare per me
<!-- : 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>
Immagina di voler comprimere la stessa cartella in cui ti trovi nel Prompt dei comandi SENZA aprire una finestra di PowerShell:
powershell Compress-Archive . publish.zip
Pubblicherò qualcosa correlato alla risposta WSkids poiché purtroppo non posso usare la funzione di commento.
L'uso del metodo CopyHere () in VBS introduce diversi problemi. Uno di questi problemi è che il metodo ritorna immediatamente mentre il processo di copia inizia in background mentre più chiamate CopyHere () interferiranno a vicenda e lo ZIP non verrà creato correttamente. È necessario un loop di attesa qui per risolvere il problema. Il mio ciclo di attesa si basa su una risposta a un problema simile pubblicato qui .
Ecco una versione aggiornata che corregge l'errore "Oggetto richiesto" segnalato da pihentagy . È un problema di temporizzazione poiché il file ZIP appena creato viene incluso nella raccolta Articoli quando lo script viene eseguito su macchine veloci.
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
Ecco un mio tentativo di riassumere le finestre delle funzionalità integrate per la compressione e la decompressione - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders -con-batch-f
con alcune soluzioni fornite che dovrebbero funzionare su quasi tutti i computer Windows.
compress.exe
.