我想制作一个批处理文件来打印变量的值,方法是通过命令行参数 ex 传递变量的名称。
print.bat username
print.bat 的内容是
@echo off
setlocal
set v=%%%1%%%
echo | echo %v%
虽然脚本运行良好,但我还是不明白
echo | echo %v%
我对管道的理解是,第一个命令(即管道操作符左侧的命令)的输出传递给第二个命令(即管道操作符右侧的命令),因此根据此正确方法应该是 echo %v% | echo
(这不起作用)。
有人可以解释这种行为吗?
谢谢
答案 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