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

[其他] cmd管道中一个神奇的现象;

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

这会儿这个现象又消失了。。。纳闷
SOS --- >> lllsoslll@163.com

不会吧,那不是子进程里的变量么,听zqz谈及过,回头上电脑找下帖子

TOP

是幻觉

TOP

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

TOP

话说这个现象能稳定的存在,那太爽了,求简单易行方法。。。
SOS --- >> lllsoslll@163.com

TOP

本帖最后由 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 变量新值的尝试是一定不会成功的。

TOP

回复 4# applba


    跟楼主说的完全不是一回事

TOP

  1. echo abcd|set x=
复制代码
在cmd中,如何让上面命令执行后,x的值为abcd
doskey是否可实现?
这个实现了极大增强了cmd的功能。。
SOS --- >> lllsoslll@163.com

TOP

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

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

TOP

你先实现了,我可以造一个惊喜给大家。。。
SOS --- >> lllsoslll@163.com

TOP

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

(echo 123||set x=
set x )>a.txt
start a.txt
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

回复 10# lllsoslll


    期待惊喜啊

TOP

返回列表