对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 所说,代码无法使用特殊符号正常工作:*
、?
、%%
在变量内容中。
【讨论】:
这是如何工作的?你能解释一下吗? normalFOR
的一个小缺点,如果 *
或 ?
在列表中,则会失败
如果 var 包含空格,这将不起作用?
我的错误。它应该有效。但是当解析器遇到其他特殊符号时,它会失败。以上是关于对cmd中的每一行变量运行命令的主要内容,如果未能解决你的问题,请参考以下文章