找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 16003|回复: 5

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

[复制链接]
发表于 2009-12-28 09:32:51 | 显示全部楼层 |阅读模式
可能是以前没仔细学吧,这次从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 编辑 ]
 楼主| 发表于 2009-12-28 09:37:38 | 显示全部楼层
上面管道另一端没有接收信息,我再测试了一下

(echo c &echo b)|for /f %a in ('sort') do set x=%a
回显说 x=b
然后说 x=c
但echo %x% 仍显示%x%
发表于 2009-12-28 12:39:47 | 显示全部楼层
的确是没仔细吧。
子进程怎么能改变父进程的内存空间?(除了共享内存)
同样父进程也不能在子进程产生后再改变子进程的变量(还是因为不同的内存空间),除非产生之前改变变量,再让子进程继承。
 楼主| 发表于 2009-12-28 13:22:55 | 显示全部楼层
说的是俺不知道管道里面的命令是属于子进程呢。
发表于 2010-1-3 11:36:45 | 显示全部楼层
子进程的说法是第一次听说
但确实也很有道理
以前学习的时候
是把“管道”理解成cmd这个“外壳之外”又开启了一层“外壳”
在外面这个外壳中运行完管道命令后再抛弃掉它
echo  a|set b=1的运行过程类似于
cmd /c:echo a>tmpfile
cmd /c:set b=1<tmpfile
看来都是老观念了
发表于 2011-3-7 11:07:51 | 显示全部楼层
学习了,看来用"原理"去理解"原理"是一种比较好的做法,毕竟事物并不是独立存在的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:49 , Processed in 0.018168 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表