web-dev-qa-db-ja.com

サブディレクトリ内のすべてのZipアーカイブをバッチ解凍します。アーカイブにちなんで名付けられた新しいディレクトリに抽出された各アーカイブのコンテンツ

私は大量のサブフォルダを含むフォルダを持っています。これらのサブフォルダ内には圧縮ファイルがあります。

これらのファイルをZipファイルにちなんで名付けられたフォルダに解凍する方法を考えていたので、たとえば次のようにします。

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

に変わります

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

私は現在これを行うことができますが、一度に1つのフォルダーでそれを行う場合にのみ、一度にすべてを行う方法があるかどうか疑問に思っていました。

5
Chris Jackson
@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"
    )
)

正常に解凍されたZipファイルを破棄する場合は、delの前にあるRemを削除します。

バッチは 変数〜修飾子の場合 を使用して、完全なファイル名の一部のみを使用します

2
LotPings

これを達成するためのPowerShellワンライナー:

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

次に、各セクションの説明を示します。各セクションは、次のセクションにパイプされ、Powershellによって順に実行されます。

  • Get-ChildItem -Filter * .Zip -Recurse C:\ Archives:C:\ ArchivesにあるすべてのZipファイルを検索します
  • %{$ _。FullName}:結果のforeachオブジェクト、フルパスと名前を表示
  • Split-Path:各Zipのパス(ファイル名ではなく)のみを表示します
  • Get-Unique:リストから重複を削除します
  • %{cd $ _;& 'C:\ Program Files\7-Zip\7z.exe' x * .Zip -o *}:最後に、作成されたリストを使用して、見つかった各ディレクトリに移動します; 7z.exeを使用して各ディレクトリにあるすべてのZipファイルを解凍し、-o *引数を使用して各Zipファイルの内容をそのZipファイルの名前のディレクトリに解凍します

仮定:

  • C:\ Archivesは、すべてのZipファイルが格納されるディレクトリです。
  • 7-Zipはデフォルトの場所にインストールされています

この質問を調査しているときに、PowerShellよりもbashを好むという結論に達しました:-)

1
FosseWay