Board logo

标题: [其他] cmd管道中一个神奇的现象; [打印本页]

作者: lllsoslll    时间: 2012-4-13 19:55     标题: cmd管道中一个神奇的现象;

刚在cmd中键入
  1. echo 123|set x=
  2. set x
复制代码
结果显示 x=123

这会儿这个现象又消失了。。。纳闷
作者: CrLf    时间: 2012-4-13 20:19

不会吧,那不是子进程里的变量么,听zqz谈及过,回头上电脑找下帖子
作者: gawk    时间: 2012-4-13 20:31

是幻觉
作者: applba    时间: 2012-4-13 20:33

  1. echo 2012/4/1|date
  2. echo %date%
复制代码

作者: lllsoslll    时间: 2012-4-13 20:34

话说这个现象能稳定的存在,那太爽了,求简单易行方法。。。
作者: CrLf    时间: 2012-4-13 21:48

本帖最后由 CrLf 于 2012-4-13 21:59 编辑

回复 5# lllsoslll

理论上应该不可能,zqz 的解释见:
    http://bbs.bathome.net/redirect. ... 6&fromuid=30406
其后对于缓冲区异象的相关讨论见:
    http://bbs.bathome.net/viewthread.php?tid=14455
而管道符与子进程的关系见(估计老兄应该知道这个的):
    http://bbs.bathome.net/redirect. ... 0&fromuid=30406

     归纳简述一下,管道前后存在语句块或者内部命令时,必然启动一个子进程来进行解析,所以 echo test|set /p input= 并非赋值失败,而是将值赋给子进程 cmd 中的 input 变量,而我们知道进程的变量环境只在创建时向下继承,创建之后的变量环境变动互不相干,因此当管道运行结束后,成功获取 input 变量的子进程随之退出,此时在父进程 cmd 中获取 input 变量新值的尝试是一定不会成功的。
作者: gawk    时间: 2012-4-13 22:30

回复 4# applba


    跟楼主说的完全不是一回事
作者: lllsoslll    时间: 2012-4-15 18:43

  1. echo abcd|set x=
复制代码
在cmd中,如何让上面命令执行后,x的值为abcd
doskey是否可实现?
这个实现了极大增强了cmd的功能。。
作者: CrLf    时间: 2012-4-15 18:52

本帖最后由 CrLf 于 2012-4-15 18:59 编辑

咦?突然发现楼主说的是 set 而非 set/p,我又跑偏了…不过目测感觉不可能啊,回头上机实验。不过不明白的是,楼主认为这和传统方案相比优势何在呢?
作者: lllsoslll    时间: 2012-4-15 19:51

你先实现了,我可以造一个惊喜给大家。。。
作者: Taurus    时间: 2012-5-7 03:17

我覺得樓主可能測試途中把 | 打成 ||

(echo 123||set x=
set x )>a.txt
start a.txt
作者: 秋风·飞扬    时间: 2012-5-7 12:15

回复 10# lllsoslll


    期待惊喜啊




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2