5

В моем пакетном файле у меня много вызовов одной и той же программы с одинаковыми параметрами:

program.exe file1.txt -parameter1 -parameter2 -parameter3 -parameter4 >> output.log
program.exe file2.txt -parameter1 -parameter2 -parameter3 -parameter4 >> output.log
...

Могу ли я объявить переменную, которая будет содержать строку «-parameter1 -parameter2 -parameter3 -parameter4 >> output.log», и использовать ее следующим образом:

Set variable=-parameter1 -parameter2 -parameter3 -parameter4 >> output.log 
program.exe file2.txt %variable%

Я пытался сделать это, но это не работает. Если это возможно, каков правильный синтаксис?

3 ответа3

4

Я начал отвечать на этот вопрос, чтобы сказать: «Извините, но нет». К моему удивлению, вы можете! Это не очень красиво или эффективно, но вы можете сделать это.

Сохранить обычные аргументы для program.exe в переменной просто. Это работает (это только ваш пример, без перенаправления):

SET MYARGS=-parameter1 -parameter2 -parameter3
program.exe file1.txt %MYARGS%

Перенаправление, тем не менее, обрабатывается не как аргументы программы, а как директивы для оболочки. Это происходит перед установкой или расширением переменной, поэтому включение суффикса >> output.log записывает вывод в файл журнала.

Чтобы заставить это работать, вы должны экранировать командную строку и запускать новый процесс для каждого вызова вашей программы.

SET MYARGS=-parameter1 -parameter2 -parameter3 -parameter4 ^^^>^^^> output.log
CMD.EXE /C program.exe file1.txt %MYARGS%
CMD.EXE /C program.exe file2.txt %MYARGS%

Конечно, если имя или местоположение вашего файла журнала когда-либо нужно будет изменить, этот способ делает его немного чище:

SET LOGFILE=output.log
SET TOLOG=^^^>^^^> %LOGFILE%
SET MYCMD=-parameter1 -parameter2 -parameter3 -parameter4
CMD.EXE /C program.exe file1.txt %MYARGS% %TOLOG%
CMD.EXE /C program.exe file2.txt %MYARGS% %TOLOG%

Раскручивать целый командный интерпретатор для каждого вызова немного тяжело, но, возможно, это нормально для вашей ситуации. Если вы попробуете это, мне будет интересно посмотреть, как это повлияет на ваше время выполнения.

ПРИМЕЧАНИЕ . У этого трюка есть как минимум еще одна возможная ловушка. Переменные, заданные вами в командном файле, не будут доступны в оболочках CMD, которые вы вызываете. Вы можете заставить их быть, но это больше кода, и не выглядело необходимым для того, что вы делаете.

См. Скрытые возможности пакетных файлов Windows для уловки ^ escape и многое другое.

3

В команде SET вы должны экранировать каждый знак> знаком ^.
Это не позволяет команде SET интерпретировать >> как перенаправление вывода.

Так:

Set variable=-parameter1 -parameter2 -parameter3 -parameter4 ^>^> output.log
program.exe file2.txt %variable%

Ответ Лемура - правильная версия, если вы собираетесь вызывать подоболочки (с CMD /C), но для прямого вызова это не требуется.

1

Можно ли использовать переменную для представления нескольких параметров программы в командной строке Windows?

Определенно да

Могу ли я объявить переменную, которая будет содержать строку:
    -parameter1 -parameter2 -parameter3 -parameter4 >> output.log

и используйте это так:
    set variable=-parameter1 -parameter2 -parameter3 -parameter4 >> output.log
    program.exe file2.txt %variable%

Да, вы определенно можете это сделать, но, как уже упоминалось, вам нужно экранировать символы перенаправления.

Вы не указали, должны ли вы устанавливать переменную в пакетном файле. Если нет, то вы можете использовать обычный диалог Переменная окружения для установки переменной (как показано ниже).

Если вам необходимо установить переменную в пакетном файле, то вы можете либо экранировать ее, как указали другие, но это имеет тенденцию быть громоздким из-за синтаксиса. Вместо этого вы можете просто процитировать вызов, чтобы set:

…
set "variable=-parameter1 -parameter2 -parameter3 -parameter4 >> output.log"
program.exe file2.txt %variable%
…

Снимок экрана: диалоговое окно "Переменные среды" с переменной, содержащей символы перенаправления

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .