คุณสามารถ zip ไฟล์จากพรอมต์คำสั่งโดยใช้ความสามารถในตัวของ Windows ในการ zip ไฟล์เท่านั้น


111

ฉันมีแบตช์ไฟล์ที่ส่งออกไฟล์ข้อความ ฉันคิดว่ามันคงจะดีถ้าฉันสามารถซิปมันได้เช่นกัน

สิ่งนี้จะถูกใช้ในสภาพแวดล้อมที่ไม่มีการควบคุมดังนั้นฉันจึงไม่สามารถตั้งสมมติฐานเกี่ยวกับการปรากฏตัวของผลิตภัณฑ์ซอฟต์แวร์ของบุคคลที่สามเช่น7-Zipฯลฯ ได้ซึ่งจำเป็นต้องใช้ความสามารถในตัว Windows ตอนนี้ในการซิปไฟล์


1
คุณสามารถใช้สคริปต์ Powershell หรือ WSH ได้ไหม นั่นอาจเป็นวิธีเดียวที่จะใช้การจัดการ zip builtin ของ Windows จาก commandline มิฉะนั้นอย่างที่มอลลี่ชี้ให้เห็นคุณต้องมีเครื่องมือของบุคคลที่สาม
ต้มตุ๋น quixote

1
ดังนั้นคุณจึงส่งไฟล์แบตช์ให้กับคนและคุณไม่สามารถส่ง gzip.exe แบบ static static ขนาดเล็ก ๆ มาเชื่อมโยงเขาได้?
akira

คำถามของ OP เป็นคำถามที่ยอดเยี่ยม (ข้อกล่าวหาแปลก ๆ ของ @quackquixote แม้จะมี) เนื่องจาก Windows ให้การคลิกเพียงครั้งเดียวภายใต้ SendTo จึงควรมีคำสั่งที่ใช้งานได้ในไฟล์ BAT ดังนั้นจึงเป็นคำถามที่ดีแม้ว่าคำตอบคือไม่และใครก็ต้องหันไปใช้เครื่องมือของบุคคลที่สามที่อาจหรืออาจไม่เท่าเทียมกัน
Jon Coombs

นี่คือลิงค์ของ Tomas มีสคริปต์ที่เป็นลายลักษณ์อักษรอย่างดีในการซิปเนื้อหาของโฟลเดอร์ เพื่อให้มันทำงานได้เพียงแค่คัดลอกสคริปต์ลงในไฟล์แบตช์และดำเนินการโดยระบุโฟลเดอร์ที่จะซิป (แหล่งที่มา) ไม่จำเป็นต้องพูดถึงไดเรกทอรีปลายทางเนื่องจากเป็นค่าเริ่มต้นในสคริปต์ไปยังเดสก์ท็อป ("% USERPROFILE% \ Desktop")
Abhijeet

3
คำสั่งที่ง่ายที่สุดคือในคำสั่ง cmd: powershell.exe Compress-Archive file-to-zip.txt zippedfile.zip(มันใช้ได้กับโฟลเดอร์ด้วย)
ThomasGuenet

คำตอบ:


85

นี่เป็นโซลูชันไฟล์แบตช์ทั้งหมด (รูปแบบของคำตอบอื่น ๆ ของฉัน) ที่จะซิปไฟล์ชื่อc:\ue_english.txtและใส่ไว้ในC:\someArchive.zip:

set FILETOZIP=c:\ue_english.txt

set TEMPDIR=C:\temp738
rmdir %TEMPDIR%
mkdir %TEMPDIR%
xcopy /s %FILETOZIP% %TEMPDIR%

echo Set objArgs = WScript.Arguments > _zipIt.vbs
echo InputFolder = objArgs(0) >> _zipIt.vbs
echo ZipFile = objArgs(1) >> _zipIt.vbs
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
echo wScript.Sleep 2000 >> _zipIt.vbs

CScript  _zipIt.vbs  %TEMPDIR%  C:\someArchive.zip

pause

TEMPDIRการเข้าถึงการเขียนจะต้องไปยังผู้ปกครองของโฟลเดอร์ที่เก็บไว้ใน เช่นนี้มักจะไม่ใช่กรณีสำหรับรูทของไดรฟ์ C TEMPDIRอาจต้องเปลี่ยน

จำเป็นต้องมีการเข้าถึงเพื่อเขียนสำหรับโฟลเดอร์ที่.batสคริปต์อยู่ (เนื่องจากสร้างไฟล์ที่นั่น)

.zipนอกจากนี้โปรดทราบว่านามสกุลไฟล์สำหรับไฟล์บีบอัดจะต้อง ความพยายามในการใช้ส่วนขยายอื่นอาจทำให้สคริปต์ผิดพลาด ให้สร้าง.zipไฟล์และเปลี่ยนชื่อแทน


3
@ackack ฉันถือออกด้วยความหวังของคำสั่งคลุมเครือที่ฉันไม่ทราบเกี่ยวกับ ฉันสามารถดูว่าคุณอาจพบว่ามีข้อกำหนดที่ยากลำบากหากไม่มีอยู่จริงไม่ได้หมายความว่าจะนำใครออกมา
Aaron Bush

@PeterMortensen: มันอาจจะเป็นหรือน่าสนใจที่จะดูว่า Powershell นี้ลดความซับซ้อนลงได้มากแค่ไหน นี่เป็นตัวอย่างที่ 5 สายแต่ยังอยู่write-zipcmdlet ที่สามารถดาวน์โหลดได้จากPscx
Tamara Wijsman

ฉันใช้ zip.exe และ cywin1.dll (3mb) เพื่อให้ตรงกับ ZIP และการใช้งานเป็นหนึ่งบรรทัด ... จาก zip ของตัวเองโดยใช้รหัสแบตช์ ฉันรู้ว่าสามารถใช้ php bancompile'd กับ argv และส่งไฟล์ไปให้ ฟังดูดีนะ. "ซิปจากบรรทัดคำสั่งของ windows" เป็นภาพยนตร์นิยายวิทยาศาสตร์เรื่องเก่าใช่มั้ย
erm3nda

ทำไมเราต้องใช้โฟลเดอร์ชั่วคราวTEMPDIR? ฉันคิดว่าความตั้งใจของคุณคือห่อไฟล์FILETOZIPด้วยโฟลเดอร์ใช่ไหม?
Nam G VU

@ Peter Mortensen ฉันรู้ว่านี่เป็นด้ายเก่าและนี่คือสิ่งที่ฉันกำลังมองหา มีตัวเลือกในการบีบอัดไฟล์ขนาดใหญ่หนึ่งไฟล์เป็นชิ้นเล็ก ๆ หรือไม่?
JohnG

38

มันเป็นไปได้ที่จะ zip ไฟล์โดยไม่ต้องติดตั้งซอฟต์แวร์ใด ๆ เพิ่มเติม (ฉันมีการทดสอบ) ทางออกคือ:

เรียกใช้สิ่งนี้ในหน้าต่างบรรทัดคำสั่งเพื่อสร้างไฟล์ ZIP ชื่อC:\someArchive.zipที่มีไฟล์ทั้งหมดในโฟลเดอร์C:\test3:

CScript  zip.vbs  C:\test3  C:\someArchive.zip

ไฟล์zip.vbsประกอบด้วย:

' Get command-line arguments.
Set objArgs = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
InputFolder = FS.GetAbsolutePathName(objArgs(0))
ZipFile = FS.GetAbsolutePathName(objArgs(1))

' Create an 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 to let the ZIP command execute
' If this script randomly fails or the ZIP file is not complete,
' just increase to more than 2 seconds
wScript.Sleep 2000

ฉันไม่ได้ทดสอบเส้นทางและชื่อไฟล์ที่มีช่องว่าง มันอาจทำงานได้ถ้ามีการใส่เครื่องหมายคำพูดล้อมรอบพารามิเตอร์บรรทัดคำสั่ง


มันทำงานอย่างไร: ฟังก์ชั่นซิปในตัวใน Windows (Windows XP และใหม่กว่า) ได้รับการเปิดเผยผ่านอินเตอร์เฟสCOMจากเชลล์ Windows, explorer.exe - นั่นคือส่วน "เชลล์แอปพลิเคชัน" ส่วนต่อประสาน COM นี้สามารถใช้งานได้จากสคริปต์VBScriptเนื่องจากสคริปต์ดังกล่าวสามารถเข้าถึงส่วนประกอบ COM เพื่อให้สคริปต์มีตัวเองอย่างสมบูรณ์มันจะสร้างไฟล์ ZIP ว่างเปล่าเพื่อเริ่มต้น (หนึ่งสามารถสร้างไฟล์ ZIP ที่ว่างและคัดลอกไปยังระบบเป้าหมายพร้อมกับสคริปต์ VBScript)

VBScript ได้รับการติดตั้งตามค่าเริ่มต้นในทุกรุ่นเดสก์ท็อปของ Microsoft Windows ตั้งแต่ Windows 98

CScript.exeเป็นส่วนหนึ่งของโฮสต์สคริปต์ของ Windows Windows Script Host ได้รับการกระจายและติดตั้งโดยค่าเริ่มต้นใน Windows 98 และ Windows รุ่นที่ใหม่กว่า นอกจากนี้ยังได้รับการติดตั้งหากติดตั้ง Internet Explorer 5 (หรือรุ่นที่ใหม่กว่า)


1
+1 ทางออกที่ดีที่จะ "เพิ่งรัน" แต่ฉันเลือก BAT ด้วยเหตุผลอื่นหลายประการที่ไม่ได้ระบุไว้ ดังนั้นฉันต้องการโซลูชัน BAT
Aaron Bush

4
@Aaron Bush: สคริปต์นี้และ Beaner's ทั้งคู่ให้คำสั่งที่ซิปไฟล์บน commandline โดยใช้ฟังก์ชั่น windows builtin ตามที่ร้องขอ คุณสามารถเพิ่มคำสั่งนั้นลงใน batchfile เหมือนกัน
ต้มตุ๋น quixote

โปรดทราบว่าเส้นทางที่ส่งผ่านต้องเป็นแบบสมบูรณ์ไม่ใช่แบบสัมพัทธ์ ฉันต้องใช้เทคนิคในคำตอบที่นี่: stackoverflow.com/q/1645843/99640
Chuck Wilbur

เส้นทางต้องสมบูรณ์และดูเหมือนว่าจะล้มเหลวแบบสุ่ม :(
kixorz

ควรเลือกให้เป็นคำตอบ
Duke of Marshall שלום

12

หากคุณเปิดให้ใช้PowerShellความสามารถในการบีบอัดจะพร้อมใช้งานใน. NET 2.0 (PowerShell คือ. NET) นี่คือตัวอย่างเครดิต ( แหล่งที่มา ) ให้กับ Mike Hodnick :

########################################################
# out-zip.ps1
#
# Usage:
#    To zip up some files:
#       ls c:\source\*.txt | out-zip c:\target\archive.zip $_
#
#    To zip up a folder:
#       gi c:\source | out-zip c:\target\archive.zip $_
########################################################

$path = $args[0]
$files = $input

if (-not $path.EndsWith('.zip')) {$path += '.zip'} 

if (-not (test-path $path)) { 
  set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
} 

$ZipFile = (new-object -com shell.application).NameSpace($path) 
$files | foreach {$zipfile.CopyHere($_.fullname)}

นี่เป็นสิ่งเดียวกับรหัส CScript ในคำตอบอื่น ๆ ไม่มีการใช้คุณสมบัติ. NET (และ. NET ไม่รองรับ ZIP) ฉันสงสัยว่าสิ่งนี้อาจมีความอ่อนไหวต่อปัญหาเรื่องเวลา
Robert Schmidt

2
กระบวนการ. NET System.IO.Compression.ZipFile คลาสที่ถูกเพิ่มเข้าไปในรุ่น 4.5
โครงหลังคาคอนกรีต

7

คุณสามารถขจัดความเสี่ยงในการหมดเวลาระหว่างการบีบอัดได้โดยการหยั่งเสียงเพื่อให้มีหน้าต่างโต้ตอบการบีบอัดอยู่ วิธีนี้ยังจัดการผู้ใช้ที่ยกเลิกจากหน้าต่างการบีบอัด

objShell.NameSpace(ZipFile).CopyHere(source)

' Wait for compression window to open
set scriptShell = CreateObject("Wscript.Shell")
Do While scriptShell.AppActivate("Compressing...") = FALSE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop  

' Wait for compression to complete before exiting script
Do While scriptShell.AppActivate("Compressing...") = TRUE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop

1
+1 รหัสลิงแบบ " .Sleep(whatever)" ทำให้ฉันไม่สบาย
ivan_pozdeev

1
ถ้าฉันทำงาน vbs กับตรรกะข้างต้นสำหรับการรอคอยเป็นวิธีการที่จะได้รับการจัดการนี้ถ้าถูกเปิดตัวผ่านการจัดตารางงาน (ที่ผู้ใช้ไม่ได้เข้าสู่ระบบในร่างกาย.)
เวสสตรีท

5

หากคุณสามารถติดตั้งResource Kit Toolsคุณจะพบเครื่องมือบรรทัดคำสั่งชื่อ COMPRESS ที่สามารถสร้างไฟล์เก็บถาวรที่บีบอัดเช่น zip

Microsoft (R) File Compression Utility  Version 5.00.2134.1
Copyright (C) Microsoft Corp. 1990-1999.  All rights reserved.

Compresses one or more files.

COMPRESS [-r] [-d] [-z] Source Destination
COMPRESS -r [-d] [-z] Source [Destination]

  -r            Rename compressed files.
  -d            Update compressed files only if out of date.
  -zx           LZX compression.
  -z            MS-ZIP compression.
  -zq[n]        Quantum compression and optional level
                (in range 1-7, default is 4).
  Source        Source file specification.  Wildcards may be used.
  Destination   Destination file | path specification.
                Destination may be a directory.
                If Source is multiple files and -r is not specified,
                Destination must be a directory.

3
+1 ไม่ได้แก้ปัญหาจริงๆ แต่ก็ยังดีที่รู้
Aaron Bush

3
'Keep script waiting until compression is done
Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count
    WScript.Sleep 200
Loop

สิ่งที่ฉันกำลังมองหา .. แต่มันทำให้ฉันมีข้อผิดพลาด "หายไปในไฟล์ Zip ที่ว่างเปล่า"
Sonic Soul

ด้วยเหตุผลบางอย่างสิ่งนี้จะไม่มีวันเพิ่มขึ้นถ้าฉันพิมพ์objShell.NameSpace( ZipFile ).Items.Countภายในลูปมันจะเป็น 0 เสมอแม้ว่าไฟล์ zip จะถูกสร้างขึ้นและมีเนื้อหาที่คาดหวังอยู่ภายใน ...
Thom Nichols

2

หลายไฟล์ / ไดเรกทอรีด้วยรหัสที่ง่าย

cscript zip.vbs target.zip sourceFile1 sourceDir2 ... sourceObjN

ไฟล์ zip.vbs

Set objArgs = WScript.Arguments
ZipFile = objArgs(0)

' Create empty ZIP file and open for adding
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set zip = CreateObject("Shell.Application").NameSpace(ZipFile)

' Add all files/directories to the .zip file
For i = 1 To objArgs.count-1
  zip.CopyHere(objArgs(i))
  WScript.Sleep 10000 'REQUIRED!! (Depending on file/dir size)
Next

2

นี่คือการกลายพันธุ์ของคำตอบที่ยอมรับ ฉันทำงานอัตโนมัติหลาย ๆ ครั้งในไฟล์หลายพันไฟล์ต่อครั้งดังนั้นฉันจึงไม่สามารถนอนหลับได้เป็นเวลา 2 วินาทีและไม่สนใจมัน ผมรวบรวมวิธีแก้ปัญหาที่นี่ซึ่งยังคล้ายกับคำตอบJiříKočaraของที่นี่

สิ่งนี้จะทำให้โฟลเดอร์ปลายทางส่ง Ping ไปทุก ๆ 200ms ซึ่งเร็วพอ ๆ กับที่ Microsoft แจ้งว่าจะตรวจสอบการอัพเดทของ FS

Set parameters = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
SourceDir = FS.GetAbsolutePathName(parameters(0))
ZipFile = FS.GetAbsolutePathName(parameters(1))
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set shell = CreateObject("Shell.Application")
Set source_objects = shell.NameSpace(SourceDir).Items
Set ZipDest = shell.NameSpace(ZipFile)
Count=ZipDest.Items().Count
shell.NameSpace(ZipFile).CopyHere(source_objects)
Do While Count = ZipDest.Items().Count
    wScript.Sleep 200
Loop

1

ต่อไปนี้เป็นความพยายามของฉันที่จะสรุปหน้าต่างความสามารถในตัวสำหรับการบีบอัดและการบีบอัด - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders เมื่อใช้ชุด-F

ด้วยโซลูชั่นที่ให้มาเล็กน้อยที่ควรใช้กับเครื่อง windows เกือบทุกเครื่อง

เกี่ยวกับshell.applicationและ WSH ฉันชอบjscript เนื่องจากอนุญาตให้ใช้ไฟล์ batch / jscript ไฮบริด (ที่มีนามสกุล. bat) ที่ไม่ต้องการไฟล์ temp ฉันได้ใส่ความสามารถ unzip และ zip ในไฟล์เดียว .


0

หากใน Windows 8 หรือ Windows Server 2012 คุณจะมี PowerShell และ. NET 4.5 เพื่อให้คุณสามารถทำสิ่งนี้:

zip.ps1 (การใช้งาน:)-directory <directory to zip up> -name <zip name> :

param (
    [string]$directory,
    [string]$name
)

Add-Type -Assembly System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory($directory, $name, [System.IO.Compression.CompressionLevel]::Optimal, $false)

zip.bat (หากคุณต้องการให้ผู้ช่วยโทร PowerShell ให้คุณไดเรกทอรีนั้นเป็นอาร์กิวเมนต์แรกและชื่อรหัสไปรษณีย์ที่สอง):

@Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"

0

Windows 10 build 17063 หรือใหม่กว่านั้นมาพร้อมกับ tar.exe ซึ่งสามารถทำงานกับ zip ได้จากบรรทัดคำสั่ง

tar.exe -xf archive.zip

หรือเพื่อสร้างที่เก็บถาวร

tar.exe -cf Test.zip Test

-5

ตอนนี้บรรทัดคำสั่งของ Windows ให้คำสั่งแบบกระชับซึ่งเท่าที่ฉันสามารถบอกได้ว่าเป็นภาษาของ Windows นั่นควรเป็นไปตามข้อกำหนดที่ร้องขอเว้นแต่ฉันจะพลาด


9
compactมีอยู่ตั้งแต่ XP และเป็นเครื่องมือในการจัดการการบีบอัด NTFS
Der Hochstapler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.