我想通过通过命令行参数 ex 传递变量的名称来制作一个批处理文件来打印变量的值。
print.bat username
print.bat 的内容是@echo off
setlocal
set v=%%%1%%%
echo | echo %v%
虽然脚本运行良好,但我仍然不明白echo | echo %v%
我对管道的理解是,第一个命令(即管道运算符左侧的命令)的输出传递给第二个命令(即管道运算符右侧的命令),因此根据此正确的方法应该是echo %v% | echo
(不起作用)。有人可以解释这种行为吗?
谢谢
最佳答案
%1
是在命令行上传递的第一个参数,在您的示例 username
中。然后在解析该行时将 %%
减半,并丢弃末尾唯一的 %
,将 v
设置为 %username%
。
echo %v%
被解析为 echo %username%
,但管道强制它在解释器的第二个实例中执行,在那里它经历另一轮解析,将 %username%
扩展为 username
环境变量的值。
由于 echo
不使用标准输入流,因此不能也不能工作。第一个 echo %v%
命令的输出被丢弃,第二个 echo
找不到命令行参数,因此它打印通常的 ECHO is on
。
这里的关键点是 echo
中的第一个 echo | echo %v%
实际上并没有用作 echo
。它的唯一作用是允许管道,这反过来又会导致重新解析第二个 echo
命令。例如 type nul | echo %v%
的工作原理是一样的。
然而,这可以通过使用 call
更便宜地完成而无需不必要的管道。
@echo off
setlocal
set "v=%%%1%%"
call echo %v%
关于windows - 带有管道运算符的 echo 命令在 Windows 上的行为?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/65854112/