Несколько команд do в цикле for: вывод строки в файл и перенаправление в окно команд - PullRequest
12 голосов
/ 24 февраля 2011

Я пытаюсь написать командный файл, чтобы итеративно выполнить исполняемый файл, скомпилированный на фортране. Обычно можно перейти в командную строку Windows, введите «Model.exe». Это вызовет окно команды dos, в котором пользователю будет предложено ввести нужное имя файла непосредственно в командном окне в командной строке dos.

Я хочу написать командный файл, который будет делать этот бит для меня, а также повторить этот шаг, чтобы я мог последовательно запустить 10 симуляций вместо того, чтобы делать это вручную. Этот тип операции с оболочкой был бы прост в Linux, но у меня нет этого доступного.

Мой псевдокод будет выглядеть так:

для / L %% обкатки (1,1,10) до
(set str = Sim %% run
эхо.% str%> input.txt
Model.exe

Вы можете разбить это на следующие шаги:

  1. Присвойте переменной 'run' значение. (например, 1)
  2. Объедините это со строкой ("Sim"), чтобы создать новую переменную "Sim1"
  3. повторить это в текстовый файл ("input.txt")
  4. Считать переменную "Sim1" из файла "input.txt"
  5. Исполняемый файл уходит и делает свое дело.
  6. Повторите шаги 1 -> 5, но с новой переменной calle "Sim2" и т. Д.

Я могу заставить работать вышеперечисленное, если я использую set str = Sim1 , а затем выводить это напрямую в «input.txt», но я не могу заставить это работать как цикл. Я что-то упустил?

С уважением,

Ben

1 Ответ

24 голосов
/ 24 февраля 2011

Тьфу, 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, но я предполагаю, что есть веская причина, по которой вы хотите использовать другую переменную.)

...