Bạn có thể nén tệp từ dấu nhắc lệnh bằng cách sử dụng khả năng tích hợp sẵn của Windows để nén tệp không?


111

Tôi có một tệp bó xuất ra một tệp văn bản. Tôi nghĩ nó sẽ tốt nếu tôi có thể nén nó lên.

Điều này sẽ được sử dụng trong môi trường không được kiểm soát, vì vậy tôi không thể đưa ra giả định về sự hiện diện của các sản phẩm phần mềm của bên thứ ba như 7-Zip , v.v. Điều này cần sử dụng khả năng tích hợp sẵn của Windows để nén các tệp zip.


1
bạn có thể sử dụng kịch bản Powershell hoặc WSH không? đó có thể là cách duy nhất để sử dụng xử lý zip dựng sẵn của Windows từ dòng lệnh. mặt khác, như Molly chỉ ra, bạn cần một công cụ của bên thứ 3.
quack quixote

1
Vì vậy, bạn gửi cho ai đó một tệp bó và bạn không thể gửi cho anh ta một số gzip.exe được liên kết tĩnh?
akira

Câu hỏi của OP là một câu hỏi xuất sắc (mặc dù lời buộc tội kỳ lạ của @quackquixote). Vì Windows cung cấp điều này như một cú nhấp chuột duy nhất trong SendTo, nên phải có một lệnh có thể sử dụng được trong tệp BAT. Vì vậy, đó là một câu hỏi hay ngay cả khi câu trả lời là Không và người ta phải (nực cười) sử dụng một công cụ của bên thứ ba có thể có hoặc không tương đương.
Jon Coombs

Đây là liên kết bởi Tomas có một kịch bản được viết tốt để nội dung zip của một thư mục. Để làm cho nó hoạt động, chỉ cần sao chép tập lệnh vào một tệp bó và thực thi nó bằng cách chỉ định thư mục sẽ được nén (nguồn). Không cần đề cập đến thư mục đích vì nó được mặc định trong tập lệnh cho Máy tính để bàn ("% USERPROFILE% \ Desktop")
Abhijeet

3
Đơn giản nhất sẽ là, trong một dấu nhắc cmd: powershell.exe Compress-Archive file-to-zip.txt zippedfile.zip(nó cũng hoạt động với thư mục)
ThomasGuenet

Câu trả lời:


85

Đây là một giải pháp tệp bó (một biến thể của câu trả lời khác của tôi) sẽ nén một tệp có tên c:\ue_english.txtvà đặt nó vào 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

Truy cập ghi được yêu cầu cho cha mẹ của thư mục được lưu trữ trong TEMPDIR. Vì đây thường không phải là trường hợp gốc của ổ C TEMPDIRcó thể phải thay đổi.

Quyền truy cập ghi cũng được yêu cầu cho thư mục mà .battập lệnh nằm trong (vì nó tạo tệp ở đó).

Ngoài ra, xin lưu ý rằng phần mở rộng tệp cho tệp nén phải là .zip. Nỗ lực sử dụng tiện ích mở rộng khác có thể dẫn đến lỗi tập lệnh. Thay vào đó, tạo .ziptập tin và đổi tên nó.


3
@quack Tôi đang giữ hy vọng về một lệnh tối nghĩa mà tôi không biết. Tôi có thể thấy làm thế nào bạn có thể thấy rằng một yêu cầu khó khăn nếu không tồn tại, không có nghĩa là đưa bất kỳ ai ra ngoài.
Aaron Bush

@PeterMortensen: Có thể hoặc không thú vị để xem mức độ đơn giản hóa của Powershell. Dưới đây là một ví dụ 5 dòng , nhưng cũng tồn tại một write-ziplệnh ghép ngắn có thể được tải xuống từ Pscx .
Tamara Wijsman

Tôi đã sử dụng zip.exe và cywin1.dll (3mb) để đáp ứng ZIP và việc sử dụng là một dòng ... từ chính zip sử dụng một số mã hàng loạt. Tôi biết có thể sử dụng php bancompile'd với argv và truyền tệp cho nó. Nghe hay đấy. "Một zip từ dòng lệnh windows" là một bộ phim khoa học viễn tưởng cũ, phải không?
erm3nda

Tại sao chúng ta phải sử dụng một thư mục tạm thời TEMPDIR? Tôi nghĩ ý định của bạn là bọc tập tin FILETOZIPbằng một thư mục phải không?
Nam G VU

@Peter Mortensen, tôi biết đây là một chủ đề cũ, và đây gần như là những gì tôi đang tìm kiếm. Có một tùy chọn để nén một tệp lớn thành các phần nhỏ hơn không?
JohnG

38

Đó khả năng nén tập tin mà không cài đặt bất kỳ phần mềm bổ sung (Tôi đã thử nghiệm nó). Giải pháp là:

Chạy phần này trong cửa sổ dòng lệnh để tạo tệp ZIP có tên C:\someArchive.zipchứa tất cả các tệp trong thư mục C:\test3:

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

Nơi zip.vbschứa tập tin :

' 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

Tôi đã không kiểm tra nó cho các đường dẫn và tên tệp có chứa khoảng trắng. Nó có thể hoạt động nếu dấu ngoặc kép được đặt xung quanh các tham số dòng lệnh.


Cách thức hoạt động: chức năng zip tích hợp trong Windows (Windows XP trở lên?) Được hiển thị thông qua giao diện COM từ Windows shell, explorer.exe - đó là phần "Shell.Application". Giao diện COM này có thể được sử dụng từ tập lệnh VBScript vì tập lệnh như vậy có thể truy cập các thành phần COM. Để làm cho tập lệnh hoàn toàn khép kín, nó tạo một tệp ZIP trống để bắt đầu (người ta cũng có thể tạo một tệp ZIP trống và sao chép nó vào hệ thống đích cùng với tập lệnh VBScript).

VBScript đã được cài đặt theo mặc định trong mọi bản phát hành máy tính để bàn của Microsoft Windows kể từ Windows 98.

CScript.exelà một phần của Windows Script Host . Windows Script Host được phân phối và cài đặt theo mặc định trên Windows 98 và các phiên bản Windows mới hơn. Nó cũng được cài đặt nếu Internet Explorer 5 (hoặc phiên bản mới hơn) được cài đặt.


1
+1 Giải pháp tốt sẽ "Chỉ cần chạy", nhưng tôi chọn BAT vì một số lý do khác không được liệt kê. Vì vậy, tôi muốn một giải pháp BAT.
Aaron Bush

4
@Aaron Bush: tập lệnh này và Beaner đều cung cấp một lệnh nén tệp trên dòng lệnh, sử dụng các hàm dựng sẵn của windows, theo yêu cầu. bạn có thể thêm lệnh đó vào batchfile như bất kỳ lệnh nào khác.
quack quixote

Lưu ý rằng các đường dẫn đi qua phải tuyệt đối, không tương đối. Tôi cũng đã phải sử dụng các kỹ thuật trong câu trả lời ở đây: stackoverflow.com/q/1645843/99640
Chuck Wilbur

Các đường dẫn phải tuyệt đối và dường như thất bại ngẫu nhiên :(
kixorz

Điều này nên được chọn là câu trả lời.
Công tước Marshall

12

Nếu bạn mở để sử dụng PowerShell , khả năng zip có sẵn trong .NET 2.0 (PowerShell là .NET). Đây là một ví dụ ( nguồn ) tín dụng cho 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)}

Điều này về cơ bản giống như mã CScript trong các câu trả lời khác. Không có tính năng .NET nào được sử dụng (và .NET không có hỗ trợ ZIP nào). Tôi nghi ngờ điều này cũng có thể nhạy cảm với vấn đề thời gian.
Robert Schmidt

2
Lớp .NET System.IO.Compression.ZipFile đã được thêm vào trong phiên bản 4.5.
Bê tông Gannet

7

Bạn có thể loại bỏ nguy cơ hết thời gian trong quá trình nén bằng cách bỏ phiếu cho sự tồn tại của cửa sổ hộp thoại nén. Phương pháp này cũng xử lý người dùng hủy bỏ khỏi cửa sổ nén.

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. Những mã kiểu khỉ " .Sleep(whatever)" làm tôi phát ốm.
ivan_pozdeev

1
Nếu tôi đang chạy một vbs với logic ở trên để chờ, điều này sẽ được xử lý như thế nào nếu được khởi chạy thông qua một tác vụ theo lịch trình (nơi không có người dùng nào đăng nhập thực tế.)
Wes

5

Nếu bạn có thể cài đặt Công cụ tài nguyên , bạn sẽ tìm thấy một công cụ dòng lệnh có tên là COMPRESS có thể tạo các tệp lưu trữ nén như 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 Không thực sự giải quyết mọi thứ, nhưng vẫn tốt để biết về.
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

chính xác những gì tôi đang tìm kiếm .. nhưng nó gây ra lỗi cho tôi "thiếu trên tệp Zip trống"
Sonic Soul

Vì một số lý do, điều này không bao giờ tăng, nếu tôi in objShell.NameSpace( ZipFile ).Items.Countbên trong vòng lặp, nó luôn là 0 mặc dù tệp zip được tạo và nó có nội dung dự kiến ​​bên trong ...
Thom Nichols

2

Nhiều tập tin / thư mục với mã đơn giản.

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

tập tin 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

Đây là một đột biến của câu trả lời được chấp nhận. Tôi thực hiện rất nhiều nhiệm vụ tự động hóa lên đến hàng ngàn tệp cùng một lúc, vì vậy tôi không thể ngủ trong 2 giây và không quan tâm đến nó. Tôi lượm lặt cách giải quyết ở đây , cũng tương tự như câu trả lời của Jiří Kočara ở đây .

Điều này sẽ khiến thư mục đích được ping mỗi 200ms, tức là nhanh như Microsoft nói để kiểm tra các bản cập nhật 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

Đây là nỗ lực của tôi để tóm tắt các cửa sổ khả năng tích hợp để nén và giải nén - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and- Folders -với lô-f

với một vài giải pháp nhất định sẽ hoạt động trên hầu hết mọi máy tính windows.

Như liên quan đến các shell.application và WSH tôi ưa thích JScript vì nó cho phép một lai batch / file JScript (với đuôi mở rộng .bat) mà không yêu cầu tạm files.I've đặt khả năng giải nén và zip trong một tập tin cộng với một vài tính năng hơn .


0

Nếu trên Windows 8 hoặc Windows Server 2012, bạn sẽ có PowerShell và .NET 4.5 để bạn có thể làm điều này:

zip.ps1 (cách sử dụng -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 (nếu bạn cần một người trợ giúp để gọi PowerShell cho bạn, thư mục là đối số đầu tiên và tên zip thứ hai):

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

0

Windows 10 build 17063 trở lên được đóng gói với tar.exe có khả năng hoạt động với zip từ dòng lệnh.

tar.exe -xf archive.zip

hoặc để tạo kho lưu trữ

tar.exe -cf Test.zip Test

-5

Dòng lệnh Windows hiện cung cấp lệnh rút gọn, theo như tôi có thể nói, có nguồn gốc từ Windows. Điều đó sẽ đáp ứng các yêu cầu được yêu cầu trừ khi tôi bỏ lỡ một cái gì đó.


9
compacttồn tại từ XP và là một công cụ để quản lý nén NTFS
Der Hochstapler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.