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

时间:2021-01-22 23:27:58

标签: windows batch-file

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

print.bat username

print.bat 的内容是

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

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

echo | echo %v%

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

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

谢谢

1 个答案:

答案 0 :(得分:7)

<块引用>
Constants.swift

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 中的第一个 echo 实际上并未用作 echo | echo %v%。它的唯一作用是允许管道,从而导致重新解析第二个 echo 命令。例如,echo 的工作原理相同。

但是,使用 type nul | echo %v% 可以更便宜地完成此操作,无需不必要的管道。

call
相关问题