[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 老刘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

评分人数

TOP

返回列表