2

サーバー上で実行される GPO を作成しています。SourcePath=%~0\..バッチでは、バッチ自体が実行されている場所と同じ場所からファイルにアクセスできるようにうまく機能する変数を設定しました。

%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe" >fileversion
set /p filever= < fileversion

このコードは、ファイルのバージョンをチェックするのにうまく機能しfile.exeますfileversionfileversion次に変数に読み込まれますfilever

したがって、このコードは私がやりたいことをすべて実行しますが、問題があります。というファイルfileversionが GPO フォルダに作成されます ( %sourcepath%)。複数のサーバーが同時にバッチを実行している場合を除いて、これは問題ありません。すべてのサーバーが同時にこのファイルを作成しようとし、ファイルを上書きしたり、エラーを引き起こしたりする可能性があります。値が variable に読み込まれるfileverと不要になりますが、2 つのシステムが同時にスクリプトを実行できる必要があるため、値を削除するだけでは十分ではありません。

この問題が発生しない変数に値をキャプチャする別の方法はありますか? ローカルパスを前に置いてローカルにfileversion保存することを考えましたが、このオプションには熱心ではありません。

4

1 に答える 1

1

その場合はファイルを使用せず、FOR /F代わりにループを使用してコマンドの出力を直接読み取ります。次に例を示します。

FOR /F "delims=" %%L IN (
  '%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe"'
) DO (
  SET "filever=%%L"
)

一重引用符は、の出力を実行および読み取るコマンドを示します。コマンドを実行した後、その出力はループによって1行ずつ繰り返されます。

出力が1行だけで構成されている場合は、上記で十分です。変数が割り当てられ、ループが終了します。さらに行がある可能性がある場合(そして最初の行だけを覚えて、他の行が最初の値を上書きしないようにしたい場合)、少なくとも2つのオプションがあります。

  1. 変数がまだ設定(定義)されていない場合にのみ値を格納します。
SET filever=
FOR /F "delims=" %%L IN (
  '%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe"'
) DO (
  IF NOT DEFINED filever SET "filever=%%L"
)

変数を最初に設定解除する必要があることに注意してください(最初の行)。

  1. 値を保存し、ループの外にジャンプします。
FOR /F "delims=" %%L IN (
  '%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe"'
) DO (
  SET "filever=%%L"
  GOTO out
)

:out

これは最初の行を記憶し、他の行の反復を防ぐためにループを強制的に終了します。

FOR /F組み込みのヘルプ(FOR /?または)でループの詳細を読むことができますHELP FOR

于 2013-01-04T17:56:59.980 に答える