相当于Bash反引号的批次


Answers:


53

您可以通过首先将输出重定向到文件来实现。例如:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%

16
它要求您找到一个具有写访问权的位置来存储临时文件;你必须自己清理 这个例子只能使您阅读输入的第一行。出于所有实际目的,该for /f变体是更好的变体。
乔伊(Joey)2010年

@grawity-以及%random%
bacar 2011年

1
@joey它确实读取了每一行,但是如何在单个命令中连接到命令行参数。
user877329 2014年

它如何处理换行符?
andrewrk

103

您可以通过以下for /f命令使用cmd.exe脚本获得类似的功能:

for /f "usebackq tokens=*" %%a in (`echo Test`) do my_command %%a

是的,这有点不明显(至少可以说),但这就是其中的内容。

有关for /?详细信息,请参见。

旁注:我认为echo在“ for /f”命令的反引号内使用“ ” 将需要使用“ cmd.exe /c echo Test” 来完成,因为这echo是的内部命令cmd.exe,但它以更自然的方式工作。Windows批处理脚本总是以某种方式使我感到惊讶(但通常不是一种很好的方式)。


2
从不自动产生shell的外部程序执行shell-builtins时,通常必须执行此操作。Ie C system()很好,iirc,因为在任何情况下它都会启动外壳程序,但是.NET Process.Start需要显式调用外壳程序。iirc这样的东西。无论如何,我认为这是比公认的答案更好的方法:-)
Joey 2010年

2
for不会伤害但会混淆问题的选项。那怎么办:for /f %%a in ('"echo Test"') do my_command %%a
埃文·哈斯

9
在命令行上而不是在批处理脚本中执行时,请使用单个%而不是%%。
jsears 2014年

2
似乎不适用于管道,例如“>”运算符。但这真是太棒了。除非这只是我遇到的%vs %%问题。
2014年

3
@Evan:tokens=*很重要。否则,如果命令的结果包含空格,则仅输出第一个单词。在提示符下运行此:for /f %a in ('"echo foo bar"') do echo "%a"。它将打印"foo"
Dan Dascalescu 2014年

29

阅读“ for”命令的文档: for /?

遗憾的是,我自己尚未登录Windows进行检查,但我认为类似这样的内容可以满足您的需求:

for /F %i in ('echo Test') do my_command %i

6
万一有人偶然发现,从批处理文件(* .bat)执行命令时,两个%i变量都必须是双百分号:%% i。
mgouin

3

您始终可以在Windows中运行Bash。我一直都使用MSYS(比Cygwin效率更高)来做到这一点。


不幸的是,现在MSYS几乎没有维护,要获取最新的bash,您需要单独安装
Ed Randall

1
BusyBox甚至更小(〜432KB)。虽然不是完整的Bash,只是Ash。在此处获取非正式的Windows端口:frippery.org/busybox
马丁

3

也许我搞砸了标准for /f方法的语法,但是当我输入一个涉及&&和| |的非常复杂的命令时 在的极限内for /f,会引起问题。与通常的情况相比,可以稍作修改以处理任意复杂性命令:

SET VV=some_command -many -arguments && another_command -requiring -the-other -command | handling_of_output | more_handling
for /f "usebackq tokens=*" %%a in (`%VV%`) do mycommand %%a

通过先将完整而复杂的命令放入变量中,然后将对变量的引用放入限制中,而不是将复杂命令直接放入for循环的限制中,可以避免语法解释问题。当前,如果我将VV上面示例中设置的确切命令复制到使用该变量的位置%VV%,则会导致语法错误。


1
这对我不起作用,但我发现,如果用克拉(^)进行转义,则可以直接在for命令中进行管道处理:对于/ f“ usebackq tokens = *” %% a in(`command ^ | command`)do command %% a
Heptite'1

@Heptite卡转义对我不起作用,但是用双引号引起来的命令行是有效的。
亚历山大·扎鲁布金

@Heptite在我的情况下,我不知道事先需要执行的一系列命令,在一种情况下,它们是从文件中提取出来的,而在另一种情况下,则是传入的。进行转义后,您需要根据要运行的解释器的数量来了解对命令进行转义的次数,而在我的用例中,解释器的数量并不一致。
mtalexan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.