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

批处理中管道作为子进程不能改变变量

可能是以前没仔细学吧,这次从bash 教程得知
  作为子进程的运行的管道,不能够改变脚本的变量.
  1 variable="initial_value"
  2 echo "new_value" | read variable
  3 echo "variable = $variable"   #variable = initial_value


测试了一下
echo  a|set b=1
echo %b%
set b=1|echo  a
echo %b%


都是显示%b%

[ 本帖最后由 523066680 于 2009-12-28 10:57 编辑 ]

学习了,看来用"原理"去理解"原理"是一种比较好的做法,毕竟事物并不是独立存在的
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

子进程的说法是第一次听说
但确实也很有道理
以前学习的时候
是把“管道”理解成cmd这个“外壳之外”又开启了一层“外壳”
在外面这个外壳中运行完管道命令后再抛弃掉它
echo  a|set b=1的运行过程类似于
cmd /c:echo a>tmpfile
cmd /c:set b=1<tmpfile
看来都是老观念了

TOP

说的是俺不知道管道里面的命令是属于子进程呢。

TOP

的确是没仔细吧。
子进程怎么能改变父进程的内存空间?(除了共享内存)
同样父进程也不能在子进程产生后再改变子进程的变量(还是因为不同的内存空间),除非产生之前改变变量,再让子进程继承。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

上面管道另一端没有接收信息,我再测试了一下

(echo c &echo b)|for /f %a in ('sort') do set x=%a
回显说 x=b
然后说 x=c
但echo %x% 仍显示%x%

TOP

返回列表