在我的批处理文件中,我多次调用同一个程序并使用相同的参数:
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%
我尝试这样做,但不起作用。如果可以,正确的语法是什么?
答案1
在 SET 命令中,您必须用 ^ 转义每个 > 符号。
这可防止 SET 命令将 >> 解释为输出的重定向。
所以:
Set variable=-parameter1 -parameter2 -parameter3 -parameter4 ^>^> output.log
program.exe file2.txt %variable%
如果您要调用子 shell(使用 CMD /C),Lemur 的答案是正确的版本,但对于直接调用,则不需要这样做。
答案2
我开始回答这个问题时说“对不起,不行。”但令我惊讶的是,你可以!虽然不是很美观,也不高效,但你可以做到。
将常规参数存储在program.exe
变量中很简单。这是可行的(这只是您的示例,没有重定向):
SET MYARGS=-parameter1 -parameter2 -parameter3
program.exe file1.txt %MYARGS%
但是,重定向不是作为程序的参数来处理的,而是作为 shell 的指令来处理的。它发生在变量设置或扩展之前,因此包括后缀会>> 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 shell 中使用。您可以强制它们可用,但这需要更多代码,而且对于您正在做的事情来说似乎没有必要。
看Windows 批处理文件的隐藏功能逃脱^
技巧等等。
答案3
是否可以在 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%
…