Batch giải nén tất cả các lưu trữ zip trong thư mục phụ; nội dung của mỗi kho lưu trữ được trích xuất vào thư mục mới được đặt tên theo kho lưu trữ


4

Tôi có một thư mục chứa rất nhiều thư mục con, trong các thư mục con đó là các tệp nén.

Tôi đã tự hỏi làm thế nào để giải nén các tệp đó vào một thư mục được đặt tên theo tệp zip Ví dụ:

C:\Archives\Photos\A.zip
C:\Archives\Videos\B.zip
C:\Archives\Documents\C.zip

sẽ biến thành

C:\Archives\Photos\A\
C:\Archives\Videos\B\
C:\Archives\Documents\C\

Tôi có thể làm điều này hiện tại nhưng chỉ khi tôi thực hiện một thư mục tại một thời điểm, tôi đã tự hỏi liệu có cách nào để làm tất cả cùng một lúc không, tôi đã nghĩ đến một tệp .bat.

Câu trả lời:


2
@Echo off
For %%F in (Photos,Videos,Documents) Do (
    For /F "delims=" %%Z in ('Dir /B/S/A-D "C:\Archives\%%F\*.zip" 2^>Nul') Do (
        7z x "%%~fZ" -o"%%~dpnZ\" && Rem Del "%%~fZ"
    )
)

Nếu bạn muốn loại bỏ tệp zip sau khi giải nén thành công, hãy xóa Rem ở phía trước của del.

Lô sử dụng cho biến ~ biến chỉ sử dụng các phần của tên tệp đầy đủ


1

Một lớp lót PowerShell để đạt được điều này:

Get-ChildItem -Filter *.zip -Recurse C:\Archives | % { $_.FullName } | Split-Path | Get-Unique | % { cd $_ ; &'C:\Program Files\7-Zip\7z.exe' x *.zip -o* }

Dưới đây là lời giải thích của từng phần, được dẫn vào phần tiếp theo và do đó được Powershell thực hiện theo thứ tự:

  • Get-ChildItem -Filter * .zip -Recurse C: \ Archives : tìm tất cả các tệp zip trong C: \ Archives
  • % {$ _. Tên đầy đủ} : tìm kiếm đối tượng kết quả, hiển thị đường dẫn đầy đủ & amp; Tên
  • Đường phân chia : chỉ hiển thị đường dẫn (không phải tên tệp) của mỗi zip
  • Độc đáo : xóa các bản sao khỏi danh sách đó
  • % {cd $ _; & amp; 'C: \ Tệp chương trình \ 7-Zip \ 7z.exe' x * .zip -o *} : cuối cùng, sử dụng danh sách đã tạo để thay đổi vào từng thư mục được tìm thấy; sử dụng 7z.exe để giải nén tất cả các tệp zip được tìm thấy trong mỗi thư mục, với đối số -o * để giải nén nội dung của mỗi tệp zip vào một thư mục có tên của tệp zip đó

Giả định:

  • C: \ Archives là thư mục lưu trữ tất cả các tệp zip của bạn
  • 7-Zip của bạn được cài đặt ở vị trí mặc định

Trong khi nghiên cứu câu hỏi này, tôi đã đi đến kết luận rằng tôi thích bash hơn PowerShell :-)


Vâng, tôi đếm 6 lệnh cộng với 7z. Và bạn không giới hạn trong các thư mục nhất định. Tên zip A, B, C sẽ không cần trích dẫn nhưng bạn không bao giờ biết. gci C:\Archives\*.zip -r|%{&'7z.exe' x $_.FullName -o$_.Directory+$_.BaseName } cũng sẽ làm
LotPings

Chỉ có lệnh 7z thay đổi bất cứ điều gì trên đĩa. Những cái khác được dẫn vào lệnh 7z cuối cùng. Tôi đã chỉnh sửa câu trả lời của mình từ "một lệnh PowerShell" thành "một lớp lót PowerShell" để phản ánh quan sát ngữ nghĩa của bạn. Tôi không thấy gì về việc "giới hạn các thư mục đã cho" ngoài C: \ Archives \ cấp cao nhất trong câu hỏi ban đầu, đó là lý do tại sao tôi không thử điều đó. Hoặc "một tấn thư mục con" có nghĩa là "ba thư mục con" hoặc tôi đã đúng khi không giới hạn các thư mục mẫu.
FosseWay

@FosseWay Tôi đã thử chạy tập lệnh và tôi tiếp tục gặp lỗi sau: Get-ChildItem: Không thể tìm thấy tham số vị trí chấp nhận đối số '%'. Tại dòng: 1 char: 1 + Get-ChildItem -Filter * .zip -Recurse H: \ Văn học \ To-Sắp xếp% {$ _. Fu ... + ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ + CategoryInfo: UnlimitedArgument: (:) [Get-ChildItem], ParameterBindingException + đầy đủ
Chris Jackson

Rất tiếc khi biết điều đó, @ChrisJackson. Điều gì xảy ra khi bạn chỉ chạy Get-ChildItem -Filter *.zip -Recurse C:\Archives tự nó?
FosseWay
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.