web-dev-qa-db-ja.com

forループ内の複数のdoコマンド:文字列をファイルにエコーしてから、コマンドウィンドウにリダイレクトします

Fortranでコンパイルされた実行可能ファイルを繰り返し実行するバッチファイルを書き込もうとしています。通常、Windowsコマンドプロンプトに移動し、「Model.exe」と入力します。これにより、DOSプロンプトのコマンドウィンドウに必要なファイル名を直接入力するようにユーザーに求めるDOSコマンドウィンドウが表示されます。

このビットを実行するバッチファイルを作成し、この手順を繰り返して、手動で実行する代わりに10回のシミュレーションを連続して実行できるようにします。この種のシェル操作はLinuxでは簡単ですが、私はこれを利用できません。

私の擬似コードは次のようになります。

/ L %% run in(1,1,10)do
(set str = Sim %% run
echo。%str%> input.txt
Model.exe <input.txt)

これは、次の手順に分解できます。

  1. 変数「run」に値を割り当てます。 (例:1)
  2. これを文字列( "Sim")と連結して、新しい変数 "Sim1"を作成します。
  3. これをテキストファイル( "input.txt")にエコーします
  4. ファイル「input.txt」から変数「Sim1」を読み取ります
  5. 実行可能ファイルはなくなり、その役割を果たします。
  6. 手順1-> 5を繰り返しますが、新しい変数calle "Sim2"などを使用します。

set str = Sim1を使用して、これを直接「input.txt」にエコーすると、上記を機能させることができますが、これをループとして機能させることはできません。私は何かが足りないのですか?

宜しくお願いします、

ベン

12
Ben Williams

うーん、cmd.exeの変数展開の扱いは醜いです。したがって、次のように「遅延拡張」が必要です。

setlocal enabledelayedexpansion
for /L %%i in (1,1,10) do (
set str=Sim%%i
echo !str! > input.txt
Model.exe < input.txt)
endlocal

(もちろん、この特定のケースでは、echo Sim%%i > input.txtとだけ言うことができますが、別の変数を経由するのには十分な理由があると思います。)

24