3

私はビルドシステムに取り組んでいます。ビルド システムは、結果を zip ファイルとしてディレクトリにポストします。残念ながら、タイムスタンプが付けられているため、zip ファイルの名前を簡単に知る方法はありません。次の操作では、この zip ファイルを特定の場所に解凍してから、さらにファイル操作を行う必要があります。

ビルドシステムを変更できると思いますので、コマンドラインから結果のzipファイルの名前を指定しますが、最新のファイルを見つけて解凍するのが最も簡単かもしれません(前のプロセスが成功)。

ディレクトリ内の最新の zip ファイルに対してのみ有効な unzip コマンドを発行し、他のすべてのファイルを無視するにはどうすればよいですか?

編集: 代わりに、このタスクに ANT の機能を使用することにしました。ただし、袖を立てるのはまだ巧妙なトリックです...答えてくれてありがとう!

4

4 に答える 4

11

これはそれを行う必要があります:

FOR /F usebackq %%i IN (`DIR /B /O-D *.ZIP`) DO UNZIP %%i && GOTO DONE || GOTO DONE
:DONE

これは次のように機能します。

  • DIR /B /O-D *.ZIPすべての ZIP ファイルを日付の逆順で「生の」形式 (つまり、名前のみ) の形式で一覧表示します。
  • FOR /F usebackqコマンドの出力をループするために使用されます。
  • && GOTO DONE || GOTO DONEUNZIP最初のファイルに対してのみ実行されるようにします。何らかの理由で解凍に失敗した場合に備えて、&&(and) と(or) の両方が必要です。||

UNZIP %%i使用する unzip コマンドを変更する必要があります。

編集 上記は、Zip ファイル名にスペースが含まれていない限り機能します。スペースを含むファイル名を処理する場合は、次のバリアントを使用します。

FOR /F "tokens=*" %%i IN ('DIR /B /O-D *.ZIP') DO UNZIP "%%i" && GOTO DONE || GOTO DONE
:DONE

違いは次のとおりです。

  • "tokens=*" オプションは、スペースが含まれていてもファイル名全体を返します。

  • UNZIP に渡されるファイル名は引用符で囲まれています

  • このバリアントは DIR コマンドに一重引用符を使用するため、"usebackq" オプションは必要ありません。

于 2008-10-07T15:23:47.837 に答える
2

Cygwin またはその他の Unix ライクな環境が代替手段である場合

unzip "$(ls -tr *zip | tail -n1)"

するだろう

于 2008-10-07T15:27:22.230 に答える
-1

圧縮/解凍をスクリプト化するには、7-zipが必要だと思います。

于 2008-10-07T15:14:11.677 に答える
-2

PowerShell またはコンソール アプリケーションを使用している場合に、なぜバット ファイルを使用するのでしょうか。

于 2008-10-07T15:12:18.017 に答える