首页 > 解决方案 > 在 Windows 上使用管道运算符的 echo 命令的行为?

问题描述

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

print.bat username

print.bat 的内容是

@echo off
setlocal
set v=%%%1%%%
echo | echo %v%

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

echo | echo %v%

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

任何人都可以解释这种行为吗?

谢谢

标签: windowsbatch-file

解决方案


set v=%%%1%%%

%1在您的示例中,是命令行上传递的第一个参数username。然后%%在解析行时将其减半,并%丢弃最后的孤单,将v设置为%username%.

echo | echo %v%

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%

推荐阅读