为什么管道后"设置-P"不起作用?

DVK*_*DVK 9 cmd pipe batch-file set

C:\>type c:\output.txt
abcd
C:\>type c:\output.txt | set /p V1=

C:\>set
... A bunch of junk, NOT seeing "V1"
Run Code Online (Sandbox Code Playgroud)

发生了什么?根据SET我见过的所有文档,%V1%应该从上面分配了"abcd"的值,不是吗?

如果重要的话,我使用的是Windows XP Pro,SP3.

小智 12

管道似乎创建了一个新的CMD实例来执行接收管道数据的下一个命令.因此,当管道结束时,该CMD实例退出并且变量丢失.


pax*_*blo 5

我不知道在该set命令中看到了什么 doco,但输出set /?明确指出:

/P 开关允许您将变量的值设置为用户输入的一行输入。

(我的斜体)。我认为set /p无论您试图通过标准输入输入什么内容,都会从控制台获取输入。为什么不等待,我不确定。echo xxx | set /p xx=也无法设置变量。

但是,如果您想从单行文件设置变量,则可以使用其中之一:

for /f "delims=" %%i in (c:\output.txt) do set V1=%%i
set /p V1=<c:\output.txt
Run Code Online (Sandbox Code Playgroud)

第二个是最简单的,但如果您想获取任意命令的输出,它并没有多大帮助,但您可能必须先将其定向到文件。

第一个允许您在没有临时文件的情况下执行任意命令:

for /f "delims=" %%i in ('echo AAA') do set xx=%%i
Run Code Online (Sandbox Code Playgroud)

此页面上有一个有趣的片段,表明它与上下文有关:

好吧,我自己发现了原因。这是因为|创建了一个新的上下文,因此该变量永远不会进入当前上下文的其余部分。证明:
> set bar=
> echo aaa | (set /p bar= && set bar)
bar=aaa
> set bar
Environment variable bar not defined

尽管我拒绝评论该结论的真实性。我不知道这个意义上的上下文是什么,我只是为了完整性而提请您注意。

  • 好吧,我认为你实际上是对的,@DVK,尽管我在上面的答案中有原始段落。这显然是某种 STDIN,因为 `set /p V1=&lt;c:\output.txt` 工作得很好。只是管道品种似乎不起作用。 (2认同)