Trích xuất tất cả các Zip trong một thư mục (bao gồm các thư mục con) bằng tệp .bat hoặc lệnh dos


6

Tôi muốn trích xuất tất cả .zip's và .rars trong một thư mục và các phần tử con của nó

Cấu trúc như thế này:

MAIN_FOLDER
    -A folder
        - a.zip
            -a.rar
    -B folder
        - b.zip
            -b.rar
    -C folder
        ....    
            ...

Tôi đã thử cái này, cái này không hoạt động

FOR /D /r %%F in ("*") DO (

  pushd %CD%
 cd %%F
    FOR %%X in (*.rar *.zip) DO (
        "C:\Program Files\7-zip\7z.exe" x %%X
    )
 popd

)

Tôi sử dụng Windows và đã cài đặt 7-Zip.

Câu hỏi bổ sung: Có thể lưu tất cả các tệp được trích xuất từ ​​những đứa trẻ cuối cùng (a.rar, b.rar) trong một và cùng một thư mục (thư mục chính) không?

Câu trả lời:


12

Kịch bản:

for /F %%I IN ('dir /b /s *.zip *.rar') DO (
    "C:\Program Files\7-Zip\7z.exe" x -o"%%~dpI" "%%I"
)

Giải trình:

for /F %%I IN ('dir /b /s *.zip *.rar') DO (

Điều này thực hiện một vòng lặp cho mỗi tệp được trả về bởi lệnh dir /b /s *.zip *.rar. Các /skể dirđể tái diễn vào các thư mục con và /bin ở định dạng trần.

Tên tệp được lưu trữ trong %%Ibiến để sử dụng sau. Nếu bạn đang gõ cái này tại dấu nhắc, bạn sẽ sử dụng %Ithay thế.

"C:\Program Files\7-Zip\7z.exe" x -o"%%~dpI" "%%I"

Điều này thực hiện khai thác. Đối số -o"%%~dpI"trích xuất tệp vào cùng thư mục nơi lưu trữ lưu trữ. Sự lựa chọn khác:

  • -o"%%~dpI" - Trích xuất vào thư mục lưu trữ.

  • -o"%%~dpnI"- Tạo một thư mục mới trong hệ thống phân cấp được đặt tên theo kho lưu trữ và trích xuất ở đó (nghĩa là AFolder\archive.ziptrích xuất vào AFolder\archive\).

  • -o"%%~nI"- Tạo một thư mục mới trong thư mục hiện tại được đặt tên theo kho lưu trữ và trích xuất ở đó (nghĩa là AFolder\archive.ziptrích xuất vào .\archive\).

  • Bỏ qua -ođối số - Trích xuất vào thư mục hiện tại.

Thí dụ:

C:\Temp>tree /F

    Folder PATH listing
    Volume serial number is 08A4-22E0
    C:.
    │   batch.bat
    │
    ├───AFolder
    │       a.zip
    │
    ├───BFolder
    │       b.zip
    │
    └───CFolder
            c.zip



C:\Temp>batch.bat > nul


C:\Temp>tree /F

    Folder PATH listing
    Volume serial number is 08A4-22E0
    C:.
    │   batch.bat
    │
    ├───AFolder
    │       a.zip
    │       a.zip.txt
    │
    ├───BFolder
    │       b.zip
    │       b.zip.txt
    │
    └───CFolder
            c.zip
            c.zip.txt

Câu trả lời chính xác! Một trong những điều tốt nhất tôi từng thấy. Giải thích cặn kẽ, rõ ràng và chính xác. Công việc tuyệt vời
ksoo

Sẽ rất khó để mở rộng tập lệnh để tôi có thể thêm một đường dẫn được mã hóa cứng cho tất cả các thư mục được trích xuất? Vì vậy, thay vì trích xuất ở vị trí hiện tại, giải nén vào một đường dẫn thư mục mới?
Austin

@Austin Tôi không có quyền truy cập ngay bây giờ, nhưng 7-Zip đi kèm với một tệp trợ giúp tuyệt vời. Có một phần cho mọi thứ 7-Zip có thể làm từ dòng lệnh và tôi cá là bạn muốn gì ở đó.
Stephen Jennings

2
Lưu ý rằng điều này sẽ không hoạt động nếu các thư mục hoặc tên tệp có không gian hoặc tab trong đó. Để làm việc với những thứ đó, bạn cần chỉ định tùy chọn "delims =" để xóa chúng dưới dạng dấu phân cách mã thông báo.
Nghĩ

1

Tôi tin rằng bạn đang tìm kiếm các forfileslệnh :

  • forfiles /s /m *.zip /c "7z x @file"

  • forfiles /s /m *.rar /c "7z x @file"


cảm ơn vì tiền boa của bạn nó không hoạt động như ý định. xin lỗi tôi không phải là công ty trong lệnh dos. ai đó sẽ nhớ viết mã làm việc? thx và dù sao cũng vui vẻ giáng sinh :)
Email

1
Bạn đã xem xét sử dụng powershell thay thế? Nên là một lót dài.
Jim B

2
@Email (1) Bạn đang nhận được lỗi gì? Nói rằng "nó không hoạt động" mà không có chi tiết là không mang tính xây dựng và "ai đó có thể viết mã làm việc không?" là xúc phạm. (2) Thư mục chương trình của 7z.exe có trong% PATH% không?
Miles Erickson

1

Tôi chỉ sử dụng scan.exe từ nhiều năm trước. Nó chạy cùng một lệnh trong thư mục hiện tại và tất cả các thư mục con.

Bạn có thể phải chạy quét nhiều lần nếu bạn đang muốn trích xuất tài liệu lưu trữ trong kho lưu trữ.

Bạn có thể sử dụng một cái gì đó như:

sweep 7za x -y *.zip

để mở tất cả các tệp .zip trong thư mục hiện tại và tất cả các thư mục bên dưới.

Phiên bản dòng lệnh 7zip có tại đây: http://www.7-zip.org/doad.html


1

Đây là bản cập nhật của câu trả lời được chấp nhận để hỗ trợ tên tệp có dấu cách ("DELIMS =") và bỏ qua ghi đè (-aos). Xem các liên kết dưới đây và mã cập nhật. Cảm ơn

Trích xuất tất cả các Zip trong một thư mục (bao gồm các thư mục con) bằng tệp .bat hoặc lệnh dos https://stackoverflow.com/questions/12487491/how-to-handle-space-of-filename-in-batch-for-loop http://7zip.ormsaco.com/7zip/MANUAL/switches/overwrite.htmlm

for /F "DELIMS=" %%I IN ('dir /b /s *.zip *.rar') DO (
    "H:\Program Files\7-Zip\7z.exe" x -aos -o"%%~dpI" "%%I"
)

for / F "DELIMS =" %% I IN ('dir / b / s * .zip * .rar') DO ("C: \ Chương trình tập tin \ 7-Zip \ 7z.exe" x -aos -o "% % ~ dpI "" %% I ")
đạt được

0
7z e -an -air!*.rar -r

trích xuất tất cả các tệp rar từ các thư mục con của thư mục hiện tại (đệ quy) vào thư mục hiện tại. Thay đổi thành -air! *. Zip cho các tệp zip.


0
@echo off

FOR /R %%g IN (.) DO TITLE Extracting from %%~ng & "%~dp07z.exe" x -aou "%%g\*.rar" -o"%%g" & "%~dp07z.exe" & CLS

Sao chép nó vào một tệp văn bản và đổi tên nó thành extract.batvà đặt nó vào thư mục mẹ có chứa các thư mục khác có lưu trữ. Đặt 7z.exetrong cùng thư mục với extract.battệp hoặc sửa đổi đường dẫn trong lệnh trên để phản ánh vị trí đã cài đặt của bạn 7z.exe. Điều này trích xuất tất cả các RAR trong mỗi thư mục con đến cùng một thư mục con như RAR. Nó không thực hiện bất kỳ "dọn dẹp nhà cửa" nào (như bạn gái của tôi) ...

Điều chỉnh *.rarđể phù hợp với nhu cầu của bạn.

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.