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.
我不知道您在该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
尽管我拒绝评论该结论的真实性。我不知道这个意义上的上下文是什么,我只是为了完整性而提请您注意。