Board logo

标题: [其他] [疑问]调用批处理时的管道信息传递 [打印本页]

作者: 523066680    时间: 2010-1-11 18:29     标题: [疑问]调用批处理时的管道信息传递

我这里有一个临时打开快递链接的批处理
  1. @echo off
  2. echo,
  3. echo,  deppon - 德邦
  4. echo,  lbex   - 龙邦
  5. echo,  sf     - 顺丰
  6. echo,  yunda  - 韵达
  7. echo,  fengda - 丰达
  8. echo,  lts    - 联昊通
  9. echo,  jiaji  - 佳吉
  10. echo,
  11. echo,退出 exit
  12. echo,
  13. set deppon="http://www.deppon.com/"
  14. set lbex="http://www.lbex.com.cn/"
  15. set sf="http://www.sf-express.com/"
  16. set yunda="http://www.yundaex.com/"
  17. set fengda="http://www.fd168.com.cn/"
  18. set lts="http://lts.com.cn/web/index.asp"
  19. set jiaji="http://www.jiaji.com"
  20. :input
  21. set /p inp="Input:"
  22. if "%inp%"=="exit" (exit)
  23. if not defined %inp% (echo,请输入一个已有的选项,谢谢。&goto :input)
  24. call :next %%%inp%%%
  25. exit
  26. :next
  27. start %~1
复制代码
有一次我在命令行中(相对路径)尝试   “echo sf|express“
结果成功直接打开顺丰的网页,本来还想加上参数判断选项呢,看来可以不加了。

但是回想到以前 echo a|set /p inp="test:"
的时候,并不能给 inp变量赋值啊,为什么调用文件结合管道的时候可以实现管道传递信息到set /p ?



【好像无意间帮几个快递公司做了广告了,其中有两个我很讨厌的,各位自己判断。】
话说这里call 好像支持到了+ 两层%

[ 本帖最后由 523066680 于 2010-4-13 08:49 编辑 ]
作者: 523066680    时间: 2010-1-11 18:50

而且传递过去的也跟手工输入的的不一样
手工输入,上面留下输入的字符。
而调用的,输入行还是显示
input:
结果就退回到原cmd了

[ 本帖最后由 523066680 于 2010-1-11 19:10 编辑 ]
作者: zqz0012005    时间: 2010-1-11 18:57

这个讨论很多次了,基本可以认定为 set /p 的“特性”,而不是管道的问题。
set /p var=<a.txt 可以
echo 内容|set /p var= 就是不行
作者: sysplay    时间: 2010-1-12 08:20

  1. if not defined %inp% (echo,请输入一个已有的选项,谢谢。&goto :input)
复制代码
这一行有三个问题,是inp不是%inp%,是&&不是&,是goto input不是goto :input。

[ 本帖最后由 sysplay 于 2010-1-12 08:21 编辑 ]
作者: 523066680    时间: 2010-1-12 08:29

让用户选择项目,输入项目名称
  if not defined %inp% 的结果是 判断 输入的项目是否存在
  if not defined inp  的结果是判断inp这个变量是否被赋值。
含义的层册不一样。

其他两项,我无异议,在没有吃到苦果之前,我还是会使用原来的方式。

[ 本帖最后由 523066680 于 2010-1-12 08:30 编辑 ]
作者: qzwqzw    时间: 2010-1-12 08:55

管理员请注意
针对某一楼的回复在我这里不能用
点击帖子下面的“回复”无反应

:zqz0012005 - 6楼
讨论再多次也不一定是真理
我们只是在真理左右徘徊并无限接近
这个问题我认为是管道的作用
而非set/p的特性

因为管道会创建cmd的子进程
或者说会创建一个外层命令解释器外壳
并且set/p的操作是写环境变量
而我们知道子进程或者外层变量不会影响父进程或者内层
如同setlocal与endlocal的效果

所以,我认为set/p在管道中接受了输入并写入了相应变量
只不过在退出管道后这个变量被"endlocal"了而已

echo sf|express之所以有效
就因为变量的写入和判断都在同一个express中
也就是在同一个子进程或同一层外壳中
作者: qzwqzw    时间: 2010-1-12 09:04     标题: 回复 5楼 的帖子

:523066680 - 3楼
看来你还是不太熟悉管道
可以这样理解管道
echo sf|exprees
等价于
cmd /c echo sf>tempfile
cmd /c express<tempfile

也就是说管道可以理解为命令解释器之间的重定向输出和输入
所以本该出现在控制台上的输出sf被管道重定向到一个临时文本中
事实上,早先的command.com确实是这样干的
只不过到了cmd时代情况稍微有一些变化而已
作者: qzwqzw    时间: 2010-1-12 09:07     标题: 回复 6楼 的帖子

回复的问题搞清楚了
因为自己的浏览器禁用JavaScript
所以点击回复后
“快速回复”里的标题出不来
看来Discuz的新版本确实修改了许多东西
作者: Batcher    时间: 2010-1-12 09:29     标题: 回复 4楼 的帖子

能否请你讲解一下用&而不用&&在这里会有什么潜在的问题吗?
能否请你讲解一下用goto :input而不用goto input在这里会有什么潜在的问题吗?
作者: Rstv    时间: 2010-1-12 17:42

原帖由 qzwqzw 于 2010-1-12 08:55 发表
讨论再多次也不一定是真理
我们只是在真理左右徘徊并无限接近
...


太精辟了。。。




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