0

このサイトや他のサイトを検索しました-喜びはありません。

:: first for loop
for /L %%x in (1,1,2) do (
generic-executable.output > grab1-%%x.txt

:: second, nested for loop
for /f "delims=" %%i in (grab1-%%x.txt) do (set grab1=%%i)
echo variable string is %grab1%%x%

generic-executable.output > grab2-%%x.txt
for /f "delims=" %%i in (grab2-%%x.txt) do (set grab2=%%i)
echo variable string is %grab2%%x%
)

ネストされたforループを実行しようとすると

1)ファイルにデータを書き込む

2)ファイルからデータを取得し、別の変数に保存します。

終了変数の名前は、各forループを連結したものである必要があります(つまり、grab1-1、2-1、1-2、2-2)。

データを変数に保存することは問題ありません。データを呼び出すように変数をフォーマットします

連結された変数のフォーマットに何かが欠けている可能性があります。シングル、'ダブル"、、、1、2 、バックスラッシュ、ACKを試しました!! ...私が得た最も近いものは^!%%

echo %grab1-%%x

与えた:

%grab1-1

何かアドバイスをいただければ幸いです。

ありがとう、デイブ

4

1 に答える 1

2

バッチ初心者のための古典的なつまずきに遭遇しました。ループ内(括弧内)に変数を設定して%var%から、同じループ内を使用して値にアクセスすることはできません。ループ全体(括弧で囲まれたコードブロック)は1回のパスで%var%解析され、解析時に展開されます。したがってvar、ループが実行される前の値が表示されます。

setlocal enableDelayedExpansion解決策は、スクリプトの上部近くを使用して遅延展開を有効にし、次に遅延展開を使用して変数を展開することです!var!。拡張の遅延とは、実行時に値が拡張されることを意味します-まさにあなたが望むものです。

これがあなたが達成しようとしていたことだと思います

setlocal enableDelayedExpansion
for /L %%x in (1,1,2) do (

  genericOutput1.exe > grab1-%%x.txt
  for /f "delims=" %%i in (grab1-%%x.txt) do set "grab1-%%x=%%i"
  echo grab1-%%x variable string is !grab1-%%x!

  genericOutput2.exe > grab2-%%x.txt
  for /f "delims=" %%i in (grab2-%%x.txt) do set "grab2-%%x=%%i"
  echo grab2-%%x variable string is !grab2-%%x!
)

::List all of the grab variable defined
set grab

実行可能ファイルの出力をファイルに保存する必要はありません。(もちろんそれがあなたの要件でない限り)。FOR / Fを使用して、出力を直接処理できます。FORコマンドには、ほとんど同じように見えますが、動作が大きく異なる多くのバリアントがあります。このバリアントは一重引用符を使用して、FOR/Fにコマンドを処理させます。

setlocal enableDelayedExpansion
for /L %%x in (1,1,2) do (

  for /f "delims=" %%i in ('genericOutput1.exe') do set "grab1-%%x=%%i"
  echo grab1-%%x variable string is !grab1-%%x!

  for /f "delims=" %%i in ('genericOutput1.exe') do set "grab2-%%x=%%i"
  echo grab2-%%x variable string is !grab2-%%x!
)

::List all of the grab variable defined
set grab

FOR / Fは各行を繰り返すことに注意してください(テキストファイルからであろうとコマンド出力からであろうと)。アルゴリズムは最後の行の内容のみを保存して印刷します-連続する各行は前の行の値を上書きします。

于 2012-06-27T21:35:13.233 に答える