【问题标题】:Can not pipe an echo to an input [duplicate]无法将回声通过管道传输到输入[重复]
【发布时间】:2021-07-08 03:45:34
【问题描述】:

我刚开始批量编程。 我尝试在 .bat 文件中执行以下代码,也直接在 CMD 中执行。 无论哪种情况,我都会收到一个空格。

ECHO My name is agent Smith |  SET /P Name="What is your name?"
ECHO Result is %Name%

A 在一本关于批处理编程的书中找到了这段代码,但不起作用。

在某处我读到 echo 在不同的上下文中, 而 SET /P 只接受用户输入的内容。

【问题讨论】:

  • 管道为任一侧启动一个新的cmd.exe 实例,因此托管实例中的变量不会改变:echo Test| (set /P VAR=& set VAR) 将返回VAR=Test,但echo Test| set /P VAR=& set VAR 不会(鉴于VAR 最初没有设置)...
  • N. B.: 你介意告诉我们你在说什么书吗?
  • 我试过像你写的那样:ECHO My name is agent Smith | (SET /P Name= & SET Name ) 直接在 cmd 中得到我:Name=My name is agent Smith 但在文件中它没有,我从 cmd 运行文件,如 c:\User>pipe-1 .bat
  • 本书是:Batchography:批处理文件编程的艺术
  • 代码是直接在命令提示符中运行还是在批处理文件中运行应该没有区别,管道的行为是一样的……

标签: batch-file


【解决方案1】:

我会查看this 堆栈溢出,以更深入地讨论导致问题的原因。简而言之,管道操作员在单独的线程中评估左侧和右侧。这意味着SET /P Name= 在其线程的上下文中设置环境变量Name,而不是在调用线程的上下文中。这可以在以下示例中更清楚地看到:

set name=invokingContext
echo threadContext | (set /p name= & set name)
set name

哪个输出:

name=threadContext
name=invokingContext

假设您具有写入权限,绕过此限制的一种简单方法是使用临时文件和重定向:

echo My name is agent Smith > tmp.txt
set /p Name=What is your name < tmp.txt
echo %Name%

哪些输出:

What is your name
My name is agent Smith

【讨论】:

  • 非常感谢,这个作品就好了!加上额外的DEL tmp.txt 行,我不会制作 unnacasarry 文件。但是我仍然想知道为什么我尝试的第一个代码不起作用?我的意思是它来自一本我认为还不错的书。是不是因为它是 2016 年写的?