- 帖子
- 992
- 积分
- 1775
- 技术
- 203
- 捐助
- 50
- 注册时间
- 2016-4-17
|
本帖最后由 老刘1号 于 2017-2-26 08:20 编辑
回复 4# liero1982
转自 http://tieba.baidu.com/p/3535724353 中华同志的普及教程
一般情况下,需要等待用户输入的外部命令才可以用管道来传递输入,
为什么是外部命令?
因为在CMD中,管道符号实际上是启动了一个新的CMD来执行后面的命令,然后将前一个进程的输出当作后一个进程的输入
如果是Echo bat吧万岁|Set /P Str=
那么cmd就会启动一个新的进程,但它是这样的
C:\windows\system32\cmd.exe /S /D /C "Set /P Str="
Str被赋值了吗?当然!
我们可以改成这样
Echo bat吧万岁|(Set /P Str=&Set Str)
就可以很明显地看到,Str的确被赋值了
但是为什么命令执行完后我Set Str还是显示未定义?
仔细看一看,Str的值在哪个CMD里?
了解了这一点,管道就变得非常简单了
还需要注意的是,管道不能传递标准错误输出流
@Echo Off
Md $Test\$Test
Rd $Test|Findstr “目录不是空的”
Echo %Errorlevel%
Pause
Echo Y|Rd /S $Test
由于$Test里面还有个目录,所以单用Rd删除时会提示"目录不是空的",
我们用管道将这个信息传递给Findstr,返回值显示为1,代表前面的Findstr执行失败了,
因为"目录不是空的"属于标准错误输出,无法用管道传递. |
-
1
评分人数
-
|