如何将字符串传递给需要文件参数的 Windows 命令?

How to pass a string to a Windows command that expects a file argument?

假设一个程序cook接受一个参数:一个文本文件的路径名,其中包含要烹饪的食物的食谱。假设我想从 batch 脚本中调用这个程序,还假设我已经在字符串变量中有了食谱:

set the_recipe = "wash cucumbers" "wash knife" "slice cucumbers"

cook ...  # What should I do here? It expects a file, but I only have a string.

改编自here

当需要文件名参数时,如何将配方传递给命令?

我想创建一个临时文件只是为了传递一个文件,但我想知道是否有其他方法可以解决这个问题。

遗憾的是,Batch 没有提供类似于 Bourne shell heredoc 的机制。有两种方法可以做到这一点:

选项 1:更改命令

如果您有权访问 cook 可执行文件,您可以添加一个标志来指示传递字符串或字符串列表而不是文件。例如,COOK/A 可能接受参数输入,而 COOK/F 接受文件。

选项 2:使用临时文件

使用临时文件。生成临时文件的典型方式是:

SET TEMPFILE=%TMP%\%~N0-%RANDOM%.tmp
ECHO.FILE CONTENT LINE 1 >> %TEMPFILE%
ECHO.FILE CONTENT LINE 2 >> %TEMPFILE%
REM AS MANY LINES AS ARE NEEDED
REM USE THE FILE
DEL/F "%TEMPFILE%" & REM DELETE THE TEMPORARY FILE

请记住,将 "" 放在 ECHO 语句中会使引号包含在文件中,并且 ECHO. 必须用于在文件中包含缩进.

如果您想将示例中的变量转换为临时文件,每个引用段都在单独的行中,则需要使用 FOR:

FOR %A IN (%THE_RECIPE%) DO (
  ECHO.%~A >> %TEMPFILE%
)

在变量替换中包含 ~ 会去掉引号,否则这些引号会出现在文件中。如果你想要文件中的引号,你可以省略波浪号。