带有管道运算符的 echo 命令在 Windows 上的行为?

Waq*_*Ali 4 windows batch-file

我想通过通过命令行参数 ex 传递变量的名称来制作一个批处理文件来打印变量的值。

print.bat username
Run Code Online (Sandbox Code Playgroud)

print.bat 的内容是

@echo off
setlocal
set v=%%%1%%%
echo | echo %v%
Run Code Online (Sandbox Code Playgroud)

虽然脚本运行良好,但我仍然不明白

echo | echo %v%
Run Code Online (Sandbox Code Playgroud)

我对管道的理解是,第一个命令(即管道运算符左侧的命令)的输出传递给第二个命令(即管道运算符右侧的命令),因此根据此正确的方法应该是echo %v% | echo(这不起作用)。

有人可以解释这种行为吗?

谢谢

dxi*_*xiv 7

set v=%%%1%%%
Run Code Online (Sandbox Code Playgroud)

%1在您的示例中,是在命令行上传递的第一个参数username。的%%解析线时则减半,独行%在端部被丢弃,留下v集到%username%

echo | echo %v%
Run Code Online (Sandbox Code Playgroud)

echo %v%被解析为echo %username%,但管道强制它在解释器的第二个实例中执行,在那里它经历另一轮解析,扩展%username%username环境变量的值。

正确的方法应该是echo %v% | echo(这不起作用)

由于echo不使用标准输入流,因此不能也不能工作。第一个echo %v%命令的输出被丢弃,第二个echo命令没有找到命令行参数,所以它打印通常的ECHO is on.

这里的关键是 first echoinecho | echo %v%实际上并不用作echo. 它唯一的作用是允许管道,这反过来又会导致第二个echo命令的重新解析。例如type nul | echo %v%,工作原理相同。

但是,这可以更便宜地完成而无需不必要的管道,使用call.

@echo off
setlocal
set "v=%%%1%%"
call echo %v%
Run Code Online (Sandbox Code Playgroud)