windows - 在 Windows 上使用管道运算符的 echo 命令的行为?
问题描述
我想制作一个批处理文件,通过命令行参数 ex 传递变量的名称来打印变量的值。
print.bat username
print.bat 的内容是
@echo off
setlocal
set v=%%%1%%%
echo | echo %v%
尽管脚本运行良好,但我仍然不明白
echo | echo %v%
我对管道的理解是,第一个命令(即管道运算符左侧的命令)的输出被传递给第二个命令(即管道运算符右侧的命令),因此根据这个正确的方法应该是echo %v% | echo
(这不起作用)。
任何人都可以解释这种行为吗?
谢谢
解决方案
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 echo
inecho | echo %v%
实际上并没有用作echo
. 它的唯一作用是允许管道,这反过来会导致第二个echo
命令的重新解析。例如type nul | echo %v%
,它的工作原理是一样的。
但是,这可以更便宜地完成,无需不必要的管道,使用call
.
@echo off
setlocal
set "v=%%%1%%"
call echo %v%
推荐阅读
- ios - iOS 富通知:发送 MP4 文件会导致缩略图透明
- android - 如何将 Lottie 库与不支持 AndroidX 的 android 项目集成?
- java - java`SingleThreadExecutor`是否保证以前的工作在新的开始之前完成?
- amazon-web-services - Docker 映像未推送到 ECR
- bash - 为什么从空值有一个纪元时间?
- centos - 如何在 centos 7 中更新 yum?
- html - 在 React JS 中更改 SVG 填充颜色
- javascript - 如何将数组中的对象推送到 csv 中的下一列
- r - 在不丢失 NULL 的情况下取消列出列表
- azure - Azure OMSforLinux 功能