Đây là trình đóng gói zip nội bộ từ Total Commander:
Tuy nhiên tôi muốn sử dụng trình đóng gói 7zip của mình. Khi tôi chọn 5 tệp, tôi nhận được 5 tệp lưu trữ .zip riêng cho mỗi tệp đã chọn. Làm thế nào để tôi làm điều đó trong 7zip?
Đây là trình đóng gói zip nội bộ từ Total Commander:
Tuy nhiên tôi muốn sử dụng trình đóng gói 7zip của mình. Khi tôi chọn 5 tệp, tôi nhận được 5 tệp lưu trữ .zip riêng cho mỗi tệp đã chọn. Làm thế nào để tôi làm điều đó trong 7zip?
Câu trả lời:
Tôi không chắc bạn có thể làm những gì bạn đang đề xuất bằng giao diện người dùng đồ họa, nhưng bạn chắc chắn có thể từ dòng lệnh:
FOR %i IN (*.*) DO 7z.exe a "%~ni.7z" "%i"
Bạn sẽ cần thay đổi thư mục ( cd
lệnh) thành F:\Downloads
thư mục trước hoặc bất kỳ thư mục nào bạn muốn thực hiện nén hàng loạt. Ngoài ra, thật dễ dàng để thay thế trong * .exe hoặc bất kỳ tiện ích mở rộng nào bạn muốn lọc để chỉ nén các tài liệu đó.
Và vòng giải mã bí mật:
%i
là một biến chứa tên tệp cho mỗi bước trong vòng lặp(*.*)
là tiêu chí lựa chọn, nó có thể dễ dàng là * .exe hoặc tương tự7z.exe
là phiên bản dòng lệnh của 7-Zip%~ni
- điều này mở rộng biến% i thành tên tệp - không có phần mở rộngNếu bạn muốn chỉ thêm các thư mục cho một thư mục nhất định, lệnh sẽ phức tạp hơn một chút vì theo mặc định FOR chỉ hoạt động với các tệp. Chúng tôi cần cung cấp cho nó một số thông tin bổ sung:
FOR /F "usebackq delims=?" %i IN (`DIR /B /A:D`) DO 7z.exe a "%i.7z" "%i"
Điều này hoạt động vì một vài phần giống như phép thuật:
/F
nói với FOR để lặp lại giá trị mở rộng trong ()usebackq
nói với FOR rằng tôi sẽ truyền lệnh và sử dụng đầu ra để lặpdelims=?
nói với FOR rằng tôi muốn tách token trên ?
- một ký tự không hợp lệ trong tên tệp và thư mục. Tôi chỉ muốn một mã thông báo./B
in DIR
là định dạng trần - chỉ tên/A:D
trong DIR
là để hạn chế kết quả theo thuộc tính, D là dành cho thư mụcNếu bạn muốn gói gọn điều này bên trong một tệp bó, thay đổi duy nhất bạn cần thực hiện là thoát gấp đôi biến% i:
FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"
Tôi thích câu trả lời của Goyuix. Tuy nhiên, nếu bạn đang sử dụng Windows 7 (hoặc đã cài đặt Power Shell) và cũng sử dụng phiên bản dòng lệnh của 7-zip, 7za.exe, thì bạn có thể chạy lệnh này:
dir | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }
Bạn cũng có thể thay đổi "dir" thành "dir * .exe" để chỉ chọn các tệp thực thi.
Một điều thú vị về Power Shell là bạn đang làm việc với các đối tượng thay vì chuỗi. Vì vậy, bạn có thể nhận được thực sự cụ thể nếu bạn muốn. Ví dụ:
dir *.csv | ? { $_.Length -lt 18900 -and $_.LastWriteTime -ge [DateTime] "07/01/2011" } | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }
Điều này sẽ chỉ bao gồm các tệp:
EDIT Nếu bạn muốn các tệp zip thay vì các tệp 7-zip, thay vào đó hãy sử dụng zip.exe của InfoZip .
7z a -tzip archive.zip *.exe
Bạn có thể tải xuống và cài đặt plugin 7zip cho Total Commander từ http://www.ghisler.com/plugins.htm Một khi bạn làm điều đó ở phía bên phải của cửa sổ từ ảnh chụp màn hình của bạn, sẽ có một lựa chọn khác để nén 7zip. Với tùy chọn đó, bạn có thể thực hiện chính xác những gì bạn đang yêu cầu.
Tôi vừa mới giải quyết chính xác vấn đề này và một trong những vấn đề tôi tìm thấy là sự trùng lặp tên thư mục trong kho lưu trữ, tức là khi nén một thư mục có tên "foo", một tệp lưu trữ chứa .\foo\fighters.txt
được tạo ra thay vì chỉ chứa một tệp fighters.txt
.
Do đó, câu trả lời là đi vào thư mục đang được xử lý và lưu trữ xuất hiện trong thư mục (gốc) trước đó, sau đó quay lại thư mục đó để xử lý thư mục tiếp theo.
Điều quan trọng nữa là có 7ZIP bỏ qua các tệp ZIP và CMD hiện có trong thư mục gốc để ngăn chặn chúng kết thúc trong kho lưu trữ, do đó các đối số loại trừ -x!*.zip
và -x!*.cmd
loại trừ.
Kịch bản này cũng sẽ duy trì cấu trúc thư mục đệ quy.
@echo off
REM Ensures variables set within the batch file are local to
REM this script only and will be removed when finished.
setlocal
if exist *.zip goto zip_exist
for /d %%X in (*) do (
cls
cd /D %%X
"e:\Program Files\7-Zip\7z.exe" a -r -x!*.zip -x!*.cmd "..\%%X.zip" "*.*"
cd ..
)
goto end
:zip_exist
Echo.
Echo Note: for this script to work, compression of
Echo pre-existing zip files is not possible.
:end
pause
Mã trên phải được sao chép vào một tệp bó, chẳng hạn như "compression_dirs.cmd" và chạy với tư cách quản trị viên từ thư mục chứa các thư mục bạn muốn nén.
Hi vọng điêu nay co ich.
Nếu bạn cần giữ cấu trúc thư mục và lưu từng tệp trong cấu trúc riêng của mình, hãy thử điều này:
Lưu lệnh này trong một tệp có đuôi .bat và đặt nó vào thư mục bạn cần nén:
FOR /R %%i IN (*.*) DO "C:\Program Files\7-Zip\7z.exe" a "%%i.7z" "%%i" -sdel
Chú thích:
-sdel: Xóa tệp gốc (tùy chọn, nếu bạn chỉ muốn giữ tệp nén)