2

他のプロセスによって作成されているファイルからいくつかの zip ファイルを生成する毎日のプロセスがあります。見つかった各 zip ファイルの 1 つの特定のファイルの内容のタイムスタンプを示す日次ログ ファイルを作成する必要があります。

次のバッチ スクリプトを作成しました。昨日はテスト システムで動作しているように見えましたが、今日は動作しません。理由はわかりません...

set VersionDirectory=C:\Test\VersionX\
set ResultOutputFile=C:\Test\LogFile.txt

for /f %%f in ('dir /b %VersionDirectory%\Installable\Packages\pattern*.zip') do (
    mkdir %temp%\%%f\
    unzip -extract -dir %VersionDirectory%\Installable\Packages\%%f %temp%\%%f\ > nul
    for %%a in (%temp%\%%f\InstallScript.xml) do set InstallScriptXMLDate=%%~ta
    rmdir /s /q %temp%\%%f\
    echo       %%f [package from %InstallScriptXMLDate%] >> %ResultOutputFile%
)

このファイルが行うべきことの簡単な要約:

  1. C:\Test\VersionX\ ディレクトリにある各 pattern*.zip ファイルをループします。
  2. このファイルを %temp%\%%f ディレクトリに解凍します (%%f はファイル名です)。
  3. %temp%\%%f\InstallScript.xml のタイムスタンプを取得し、それを %InstallScriptXMLDate% 変数に入れます
  4. %temp%\%%f ディレクトリを削除します
  5. ファイル名 (%%f) とタイムスタンプ (%InstallScriptXMLDate%) をログ ファイルにエコーします。

現在、ログ ファイルにはファイル名とそれに続く文字列 '[package from ]' 文字列のみが含まれていますが、実際の日付のタイムスタンプはありません

zip ファイルの解凍と削除は問題なく機能しています。タイムスタンプが設定されていないだけです。

4

1 に答える 1

3

変数を設定し、同じブロックで使用しています。ステートメントが実行されたときではなく、解析されcmdたときに環境変数が展開されるため、これは機能しません。そのため、ループが実行されると、すべての変数はループの値に置き換えられています。

置く

setlocal enabledelayedexpansion

バッチの開始時に の!InstallScriptXmlDate!代わりに使用します%InstallScriptXmlDate%

別の注意:は、ファイル自体を完全に反復処理できます。出力を使用しforて反復処理する必要はほとんどありません。実際、それは回避できる問題を引き起こす可能性がありますdir /bfor /f

for %%f in (%VersionDirectory%\Installable\Packages\pattern*.zip)
于 2012-07-19T12:32:10.473 に答える