Czy można utworzyć plik .zip z folderu w wierszu polecenia, nie chcę używać żadnego pliku wykonywalnego innej firmy.
Myślałem o czymś w rodzaju „wyślij do folderu skompresowanego”, ale nie wiem jak to zrobić ...
Czy można utworzyć plik .zip z folderu w wierszu polecenia, nie chcę używać żadnego pliku wykonywalnego innej firmy.
Myślałem o czymś w rodzaju „wyślij do folderu skompresowanego”, ale nie wiem jak to zrobić ...
Odpowiedzi:
Począwszy od PowerShell 5 (luty 2016 r.), Możesz używać „Compress-Archive”:
Compress-Archive -Path input.txt -DestinationPath output.zip
Lub:
Compress-Archive input.txt output.zip
http://msdn.microsoft.com/powershell/reference/5.0/microsoft.powershell.archive/compress-archive
Połączyłem ten skrypt z kilku różnych źródeł, aby lepiej odpowiadać moim potrzebom. Skopiuj i wklej skrypt do pliku z rozszerzeniem „.vbs”. Skrypt został pierwotnie stworzony dla systemu Windows XP, ale działa również w systemie Windows 7 x64 Ultimate - nie ma gwarancji, że Windows zachowa różne obiekty Shell, których używa.
Użycie: w polu uruchamiania lub w wierszu poleceń
"C:\zipper.vbs" "C:\folderToZip\" "C:\mynewzip.zip"
Ścieżka do skryptu, folder źródłowy, plik zip do utworzenia (dołącz .zip na końcu).
Nie kopiuje pustych folderów, więc bądź ostrożny.
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
Możliwe jest uruchomienie skryptu PowerShell z BAT. Plik nietoperza otrzymuje ścieżkę do katalogu do spakowania 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
Oto świetny link, który pokazuje, jak skompresować plik za pomocą rodzimych poleceń systemu Windows.
Przetestowałem to z katalogiem zawierającym wiele zagnieżdżonych plików i folderów i działało idealnie. Wystarczy postępować zgodnie z formatem wiersza poleceń.
Istnieje również sposób na rozpakowanie plików za pomocą wiersza polecenia, który również znalazłem. Jednym ze sposobów jest otwarcie okna eksploratora pokazującego zawartość spakowanego pliku. Niektóre z nich używają również Javy, która niekoniecznie jest natywna dla systemu Windows, ale jest tak powszechna, że prawie tak się wydaje.
Czy system Windows 7 ma domyślnie zainstalowany program do rozpakowywania w wierszu polecenia?
https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-using-the-command-line
To stare pytanie, ale jego aktualność jest wciąż aktualna.
System Windows ma oczywiście własny algorytm kompresji wbudowany do korzystania z plików zip, ale naprawdę działa słabo w porównaniu z produktem open source 7zip, który można znaleźć tutaj http://www.7-zip.org/
Inni omawiali już różne metody korzystania z wbudowanych funkcji systemu Windows, moje rozwiązanie wymaga instalacji dodatkowego oprogramowania.
7Zip obsługuje szeroką gamę plików, w tym ZIP, RAR, CAB i ISO oraz własny format 7z.
Możesz wyświetlić pomoc wiersza poleceń: „C: \ Program Files \ 7-Zip \ 7z.exe” - pomoc
aby wykonać prosty dodatek do archiwum zip:
„C: \ Program Files \ 7-Zip \ 7z.exe” nazwa pliku. Zip c: \ path
Oto kolejny pomysł z 4 różnych źródeł; nie moje pomysły, ale skompilowałem je, 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>
Wyobraź sobie, że chcesz skompresować ten sam folder, w którym jesteś w wierszu polecenia BEZ otwierania okna PowerShell:
powershell Compress-Archive . publish.zip
Wyślę coś związanego z odpowiedzią WSkids, ponieważ niestety nie mogę użyć funkcji komentowania.
Korzystanie z metody CopyHere () w VBS wprowadza kilka problemów. Jednym z tych problemów jest to, że metoda natychmiast wraca, gdy proces kopiowania rozpoczyna się w tle, podczas gdy wiele wywołań CopyHere () będzie przeszkadzać sobie nawzajem, a ZIP nie zostanie poprawnie utworzony. W tym celu potrzebna jest pętla oczekiwania. Moja pętla oczekiwania opiera się na odpowiedzi na podobny problem opublikowanej tutaj .
Oto zaktualizowana wersja, która naprawia błąd „Wymagany obiekt” zgłoszony przez pihentagy . Jest to problem z timingiem, ponieważ nowo utworzony plik ZIP jest zawarty w kolekcji Items, gdy skrypt jest wykonywany na szybkich komputerach.
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
Oto moja próba podsumowania okien wbudowanych możliwości kompresji i dekompresji - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders -z-partią-f
z kilkoma podanymi rozwiązaniami, które powinny działać na prawie każdym komputerze z systemem Windows.
compress.exe
.