web-dev-qa-db-ja.com

アーカイブの名前に従って、抽出されたファイルを自動的に抽出して名前を変更します

フォルダ内にたくさんのZipファイルがあります。各Zipファイルには、exp_1.txtという名前のファイルが含まれています。各Zipファイルを解凍し、各Zipファイルから抽出したファイルの名前をZipファイルの名前に変更したいと思います。

Zipファイルの名前はパターンや日付の構造には従いませんが、すべて異なります。 exp_1.txtファイルをZipファイルと同じディレクトリに抽出する方法を理解しましたが、抽出元のZipファイルの名前と一致するようにexp_1.txtの名前を変更することができません。 。

もう一度簡単に言うと、TuesdayReport.Zipから唯一のファイルexp_1.txtを抽出し、TuesdayReport.txtと同じディレクトリにあるTuesdayReport.Zipに名前を変更したいと思います。

現在、7z xを使用して、Zipファイルが配置されているのと同じディレクトリにファイルを抽出しています。これをバッチファイルから実行できるようにしたいと思います。

3
Carrie

ここ からダウンロードできる7Zipコマンドラインエディションを使用しないのはなぜですか?

このZipファイル内には、バッチプロセス中に役立つすべてのスイッチとコマンドを含むCHm形式のヘルプファイルがあります。

1
Kaveh
forfiles /M *.Zip /C "cmd /c C:\PROGRA~1\7-Zip\7z.exe e @file & ren exp_1.txt @fname.txt"
1
Bruno

これにより、現在のディレクトリ内のすべてのZipファイルから_exp_1.txt_という名前のファイルが抽出されます。名前はZipファイルと同じですが、拡張子はtxtではなくZipです。

for %a in (*.Zip) do @(7z l "%~a" -ir!exp_1.txt |findstr exp_1.txt) && 7z e "%~a" -ir!exp_1.txt -so >"%~na.txt"

これはコマンドラインから直接実行する必要があります。バッチから実行する場合は、_%_を2倍にする必要があります。

内容:

  • forループはすべてのZipファイルを列挙します
  • 最初の_7z_呼び出しとfindstrの呼び出しにより、抽出が実行されます/アーカイブに特定のファイルが含まれている場合にのみファイルが生成されます
  • 2番目の_7z_呼び出しは、実際にファイルを標準出力(_-so_スイッチ)に抽出し、stdoutをアーカイブ(マイナス拡張子)と同じ名前のファイルにリダイレクトします。 _%~n_修飾子は、ベース名のみ(拡張子なし)を取るようにcmdに指示します

アーカイブに同じ名前のファイルが(異なるディレクトリに)複数ある場合、予期しない結果が生じる可能性があることに注意してください。

バッチで配置する場合は、ファイル名を変数(ループの前)として設定して、繰り返し関連のエラーを回避することもお勧めします(上記のコマンドで3回入力する必要があります)。

1
wmz