【问题标题】:How to pass a string to a Windows command that expects a file argument? [duplicate]如何将字符串传递给需要文件参数的 Windows 命令? [复制]
【发布时间】:2021-05-06 16:05:37
【问题描述】:

假设程序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

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

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

【问题讨论】:

  • 至于您的评论,请注意例如meta.stackoverflow.com/q/357436/3001761
  • 最后一点。对第一点说不,因为这是我自己的封闭问题。
  • 是的,不幸的是,固定文本在这些情况下没有帮助 - 关键是不要再次发布相同的问题。
  • 您正在讲述一个故事,而不是一个最小的示例/问题。你有一个变量而不是一个文件,对于这个问题来说想象厨师、食谱或假设其他可能是什么并不重要
  • @LBogaardt 您的问题被低估了,因为您要求我们为您编写我们在这里不做的代码。请在为您编写代码的平台上提出您的问题,或者再次提供真正的编程相关问题。

标签: batch-file cmd arguments


【解决方案1】:

不幸的是,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%
)

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

【讨论】:

  • 是的,tmp 文件可以工作,只是不是理想的解决方案。我不知道 Windows 没有提供使用“打印”或类似于 Unix 解决方案的直接解决方案。谢谢安德鲁!
猜你喜欢
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
相关资源
最近更新 更多