将 DOS 命令的输出作为参数传递给另一个命令?

将 DOS 命令的输出作为参数传递给另一个命令?

在 Linux 中,这将接受一个命令,并将其输出(stdout)传递给另一个命令:

echo `ls`

Windows/cmd/batch 等效于什么?

答案1

cmd.exe提供了一个使用反引号的基本命令替换功能,但只能通过for环形使用/f usebackq选项。然而,与 Unix shell 所做的相比,它相当愚蠢,因为它的标准行为是只从子进程中获取每行输出的第一个字,并且只为了迭代它们,而不是为了将它们全部一次性粘贴到命令行上。(您可以使用选项稍微调整行为delims。)以下是一个例子:

for /f usebackq %F in (`dir /w s*c`) do echo %F

如果你想要真正的 Unix 风格的命令替换,你需要一个真正的 Unix shell,例如Cygwin 狂欢或我自己的(商业)汉密尔顿C壳

答案2

echo 输出的示例dir(使用单引号,而不是反引号!):

echo off & for /f "delims=" %A in ('dir') do echo %A

在交互模式下,您需要输入echo on并按Enter退出。如果您确定循环只运行一次(即输出是('xxx')一行),那么您可以直接echo on在命令中附加。

echo off & for /f "delims=" %A in ('set /a 0x3DE1') do net helpmsg %A & echo on

由于未知原因,('set /a 0x3DE1')无法执行类似操作'set /a c=0x3DE1',即使set /a c=0x3DE1它作为单个命令工作。

echo hello worldfrom 'echo hello world'(单引号)的示例:

echo off & for /f "delims=" %A in ('echo hello world') do echo %A

echo hello worldfrom ""(文字字符串)的示例:

echo off & for /f "delims=" %A in ("hello world") do echo %A

以上语法%A适用于交互模式,需要%在批处理文件中重复,例如%%A

如果echo %A在循环内执行此操作,请小心,想象一下,如果命令输出中的其中一行名为on,则会出现 2 个问题:

[1]echo $A表示echo on不会回显任何内容,并且不可见。我只能想到比较来on处理这种特定情况。

[2]echo $A表示echo on将切换回命令提示符输出;您可能需要echo off在循环内添加额外的内容,例如:

echo off & for /f "delims=" %A in ('dir /b') do echo %A & echo off

请注意,上面的示例远不等同于,``因为它逐行运行参数。您可以创建此批处理来尝试模拟echo `ls`(它循环并将所有行附加到用空格分隔的单个变量中,然后稍后作为参数传递):

@echo off
Setlocal EnableDelayedExpansion
set fls=
for /f "delims=" %%A in ('dir /b') do set fls=!fls! %%A
echo %fls%

-- 编辑:添加缺失的空格

相关内容