对cmd中的每一行变量运行命令

Posted

技术标签:

【中文标题】对cmd中的每一行变量运行命令【英文标题】:Run command for each line of variable in cmd 【发布时间】:2021-10-29 07:45:23 【问题描述】:

我想为变量的每一行(在 cmd 中,即批处理)运行一个命令(在此示例中为 echo)。在这种情况下,这些行应该由\n 分隔,但其他分隔符也应该可以工作。

因此我设置了一个变量:

> set var="foo\nbar"

然后我想在每一行上运行我的命令 (echo),即在“foo”和“bar”上。我尝试为此使用for

> for /f "tokens=* delims=\n" %s in (%var%) do (echo %s)
foo\nbar

显然这不是我想要的——我期待的是这样的

foo
bar

我如何做到这一点?

【问题讨论】:

您知道set var="foo\nbar" 没有在 foo 和 bar 之间添加换行符吗?只是两个字符“\”和n。这也是delims=\n 将在“\”和任何n 处拆分的原因。顺便提一句。 FOR /F delims 用于拆分令牌,不会产生更多循环 @jeb 虽然像; 这样的分隔符是一样的:set var=foo;bar & for /f "tokens=* delims=;" %s in ("%var%") do (echo %s) 产生foo;bar。另外我不明白你的 BTW。 【参考方案1】:

您可以使用真正的换行符来获得您想要的效果。

setlocal EnableDelayedExpansion
(set \n=^
%=empty, do not modify this line=%
)

set "var=foo!\n!bar"

for /f "delims=" %%L in ("!var!") do (
  echo ## %%L
)

变量中的其他分隔符 可以使用,但以后必须换行。

setlocal EnableDelayedExpansion
(set \n=^
%=empty, do not modify this line=%
)

set "var=my,list,delimited,by,commas"

for %%L in ("!\n!")  do (
  for /f "delims=" %%k in ("!var:,=%%~L!") do (
    echo ## %%k
  )
)

关于 FOR /F 中的 delims 选项

delims 选项用于将一行拆分为标记,这不会创建更多循环迭代 - 永远不会。

FOR /F "tokens=1,2,3 delims=;" %%A in ("123;456;789") do echo ... %%A, %%B, %%C

输出

... 123、456、789

不是

... 123 ... 456 ... 789

【讨论】:

我不关心分隔符,我只想为一组输入运行一个命令,由某些东西分隔。如果您提供; 的示例,也许最简单。【参考方案2】:

%var% 用作FOR-parcer 的输入集。 但在运行FOR 命令之前,我们应该将\n 替换为空格(+外引号):

语法:%variable:StrToFind=NewStr%

这些空格在我们的FOR-parser 中成为分隔符。

要从单个字母变量中自动删除引号,请使用符号~

语法:%~1

所以我们有下一个代码:

set var="foo\nbar"
for %%A IN (%var:\n=" "%) DO @ECHO=%%~A

附:正如jeb 所说,代码无法使用特殊符号正常工作:*?%% 在变量内容中。

【讨论】:

这是如何工作的?你能解释一下吗? normal FOR 的一个小缺点,如果 *? 在列表中,则会失败 如果 var 包含空格,这将不起作用? 我的错误。它应该有效。但是当解析器遇到其他特殊符号时,它会失败。

以上是关于对cmd中的每一行变量运行命令的主要内容,如果未能解决你的问题,请参考以下文章

如何为文件的每一行运行命令?

为啥为了Java改变环境变量后不能运行CMD中的命令

不是内部或外部命令,也不是可运行的程序 是怎么回事

cmd显示“该命令不是内部或外部命令”的解决方法

将 python 脚本作为命令行变量运行

如何从 VB.NET 运行 DOS/CMD/命令提示符命令?