สร้างโฟลเดอร์. zip จากบรรทัดคำสั่ง - (Windows)


57

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

ฉันกำลังคิดบางอย่างเช่น 'ส่งไปยังโฟลเดอร์ที่บีบอัด' แต่ฉันไม่ทราบวิธีการทำ ...


2
มีเครื่องมือในชุดทรัพยากรของ Windows compress.exeเรียกว่าเป็น
ho1

2
นี่คือลิงค์ไปยังคำถาม ServerFault ที่กล่าวถึงเพียงนี้: serverfault.com/questions/39071/…
ho1

คำตอบ:



7

ฉันไม่คิดว่าจะมีบรรทัดคำสั่งสำหรับไฟล์ ZIP ใน Windows (นอกเหนือจากcompressใน Server 2003 Resource Kit) คุณต้องใช้บุคคลที่สาม ทุกคนชอบ7zip !


6

ฉันได้รวมสคริปต์นี้จากแหล่งข้อมูลหลายแห่งเพื่อให้เหมาะกับความต้องการของฉัน คัดลอกและวางสคริปต์ลงในไฟล์ที่มีนามสกุล ".vbs" แต่เดิมสคริปต์ถูกสร้างขึ้นสำหรับ Windows XP แต่ก็สามารถใช้งานได้ใน Windows 7 x64 Ultimate - ไม่มีการรับประกันว่า Windows จะเก็บวัตถุต่างๆของเชลล์ที่ใช้

การใช้งาน: ในกล่องทำงานหรือบรรทัดคำสั่ง put-

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

พา ธ ไปยังสคริปต์, โฟลเดอร์ซอร์ส, ไฟล์ zip ที่จะสร้าง (รวม. zip ที่ท้ายสุด)

มันจะไม่คัดลอกโฟลเดอร์ว่างดังนั้นโปรดระวัง

นี่คือรหัส 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

1
ดูมีแนวโน้ม แต่ฉันได้รับ "วัตถุที่ต้องการ: 'objApp.NameSpace (... )' ข้อผิดพลาดในบรรทัดที่ 16
pihentagy

ผมมีปัญหาเดียวกัน. โค้ดด้านบนใช้งานไม่ได้หรือต้องการสิ่งพิเศษในระบบที่ผู้โพสต์ลืมพูดถึง
Shaamaan

มันใช้ WScript (สภาพแวดล้อม vbs) และวัตถุเชลล์หลายอย่าง ทั้งหมดถูกติดตั้งโดยค่าเริ่มต้นใน Windows XP (ธุรกิจ?) และ Win 7 Ultimate x64 บางทีพวกเขาอาจจะอยู่ที่นั่นนานกว่านี้สำหรับ Win8?
WSkid

2

เป็นไปได้ที่จะเรียกใช้สคริปต์ PowerShell จาก BAT ไฟล์ Bat ได้รับเส้นทางไปยัง dir ที่จะซิปและชื่อไฟล์ zip เป็นพารามิเตอร์

@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
แต่ข้อดีของวิธีนี้คืออะไร ทำไมไม่เพียงแค่เขียนสคริปต์ PowerShell ไปยังไฟล์คงที่และปล่อยให้มันยอมรับพารามิเตอร์?
เซท

ฉันลองวิธีแก้ปัญหาอื่นทั้งหมด นี่เป็นทางออกเดียวที่ไม่ปลอดภัยที่ทำงานได้อย่างสมบูรณ์ ข้อได้เปรียบที่สำคัญที่สุดคือการใช้คำสั่งดั้งเดิมของ PowerShell และไม่จำเป็นต้องสร้าง VBScript แบบเก่า
desmati

สิ่งนี้ใช้ได้กับแล็ปท็อปเก่า ๆ ของ windows7 ในปี 2019
simbo1905

1

นี่คือลิงค์ที่ยอดเยี่ยมที่แสดงวิธีการซิปไฟล์โดยใช้คำสั่งดั้งเดิมของ windows

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

ฉันทดสอบด้วยไดเรกทอรีที่มีไฟล์และโฟลเดอร์ซ้อนกันหลายรายการและทำงานได้อย่างสมบูรณ์ เพียงทำตามรูปแบบของบรรทัดคำสั่ง

นอกจากนี้ยังมีวิธีการแตกไฟล์ผ่านทางบรรทัดคำสั่งที่ฉันพบเช่นกัน วิธีหนึ่งเพียงเปิดหน้าต่างสำรวจซึ่งแสดงเนื้อหาของไฟล์ซิป บางส่วนยังใช้ Java ซึ่งไม่จำเป็นต้องมีอยู่ใน windows แต่เป็นเรื่องธรรมดาที่แทบจะดูเหมือน

Windows 7 มีการคลายซิปที่บรรทัดคำสั่งติดตั้งหรือไม่

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


3
คุณควรมีคำแนะนำในคำตอบของคุณ หากการเชื่อมโยงไปค้างคำตอบของคุณจะไร้ค่า ...
MoonSire

1

นี่เป็นคำถามเก่า แต่ความเกี่ยวข้องยังคงเป็นปัจจุบัน

Windows แน่นอนมีอัลกอริทึมการบีบอัดของตัวเองในตัวสำหรับการใช้ไฟล์ zip แต่มันทำงานได้ไม่ดีจริง ๆ เมื่อเปรียบเทียบกับผลิตภัณฑ์โอเพ่นซอร์ส 7zip ที่นี่http://www.7-zip.org/

ผู้อื่นได้พูดถึงวิธีการต่าง ๆ สำหรับการใช้ฟังก์ชั่น windows ในตัวโซลูชันของฉันต้องติดตั้งซอฟต์แวร์เพิ่มเติม

7Zip รองรับไฟล์ที่หลากหลายรวมถึง ZIP, RAR, CAB และ ISO และเป็นรูปแบบ 7z ของตัวเอง

คุณสามารถดูวิธีใช้บรรทัดคำสั่ง: "C: \ Program Files \ 7-Zip \ 7z.exe" - ช่วย

เพื่อทำการเพิ่มไฟล์ zip อย่างง่าย ๆ :

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


1

นี่คือแนวคิดอื่นจาก 4 แหล่งที่แตกต่างกัน ไม่ใช่ความคิดของฉัน แต่ฉันรวบรวมพวกเขาเพื่อให้มันได้ผลสำหรับฉัน

<!-- : 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
ยินดีต้อนรับสู่Super User ! เห็นได้ชัดว่านี่เป็นสคริปต์ที่ซับซ้อน คุณสามารถอธิบายสิ่งที่มันทำและวิธีการใช้งานได้อย่างไร
jpaugh

1

ลองนึกภาพว่าคุณต้องการบีบอัดโฟลเดอร์เดียวกันกับที่คุณอยู่ในพรอมต์คำสั่งโดยไม่ต้องเปิดหน้าต่าง PowerShell:

powershell Compress-Archive . publish.zip

นั่นไม่ใช่สิ่งที่ฉันตั้งใจจะทำ แต่จะได้ผลสำหรับฉันในตอนนี้ นั่นเป็นเคล็ดลับที่รู้ง่าย
bballdave025

0

ฉันจะโพสต์สิ่งที่เกี่ยวข้องกับคำตอบของWSkidsอย่างน่าเศร้าที่ฉันไม่สามารถใช้ฟังก์ชั่นความคิดเห็นได้

การใช้เมธอด CopyHere () ใน VBS แนะนำหลายปัญหา หนึ่งในปัญหาเหล่านี้คือวิธีการส่งคืนทันทีในขณะที่กระบวนการคัดลอกเริ่มต้นในพื้นหลังในขณะที่การเรียกใช้ CopyHere () หลายรายการจะรบกวนซึ่งกันและกันและ ZIP จะไม่ถูกสร้างขึ้นอย่างถูกต้อง ต้องรอการวนรอบที่นี่เพื่อแก้ไข ห่วงการรอคอยของฉันจะขึ้นอยู่กับคำตอบของปัญหาที่คล้ายกันโพสต์ที่นี่

นี่เป็นรุ่นที่ปรับปรุงซึ่งการแก้ไขข้อผิดพลาด "วัตถุต้อง" รายงานโดยpihentagy มันเป็นปัญหาเกี่ยวกับเวลาเนื่องจากไฟล์ ZIP ที่สร้างขึ้นใหม่รวมอยู่ในคอลเลกชันรายการเมื่อสคริปต์ถูกเรียกใช้งานบนเครื่องที่รวดเร็ว

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

0

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

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


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