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

标签 windows batch-file

我想通过通过命令行参数 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 的值环境变量。

the correct way should have been echo %v% | echo (which does not work)


echo 以来,这不起作用也不能工作不使用标准输入流。第一个echo %v%的输出命令被丢弃,第二个 echo找不到命令行参数,所以它打印通常的 ECHO is on .
这里的关键点是第一个 echoecho | 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/

相关文章:

c# - 从服务启动用户 session 中的进程

windows - Install-Module 尝试使用错误的 url 下载包

windows - SET 和 SETX 都没有设置 %PATH% 的值

visual-studio - 为什么 Visual Studio 中的所有预生成或生成后事件都失败并显示退出代码 1?

windows - 从 Cygwin 批量获取命令结果

windows - 如何使用 Inno Setup 确定是否安装了特定的 Windows 更新包 (KB*.msu)?

c++ - 修复 DirectShow 上的像素纵横比 (PAR) 问题的最佳方法是什么?

c++ - 为什么达到峰值后内存泄漏不再继续?

java - 如何通过命令行向服务器发出命令

windows - 此时 %x 出乎意料。批处理脚本