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

[其他] [疑问]调用批处理时的管道信息传递

我这里有一个临时打开快递链接的批处理
  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 编辑 ]

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

[ 本帖最后由 523066680 于 2010-1-11 19:10 编辑 ]

TOP

这个讨论很多次了,基本可以认定为 set /p 的“特性”,而不是管道的问题。
set /p var=<a.txt 可以
echo 内容|set /p var= 就是不行
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

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

[ 本帖最后由 sysplay 于 2010-1-12 08:21 编辑 ]

TOP

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

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

[ 本帖最后由 523066680 于 2010-1-12 08:30 编辑 ]

TOP

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

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

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

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

echo sf|express之所以有效
就因为变量的写入和判断都在同一个express中
也就是在同一个子进程或同一层外壳中
3

评分人数

    • CrLf: 原来是你提出的~技术 + 1
    • neorobin: 佩服 qzwqzw 对问题的态度, 学习!PB + 6
    • 523066680: 有道理PB + 6

TOP

回复 5楼 的帖子

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

也就是说管道可以理解为命令解释器之间的重定向输出和输入
所以本该出现在控制台上的输出sf被管道重定向到一个临时文本中
事实上,早先的command.com确实是这样干的
只不过到了cmd时代情况稍微有一些变化而已

TOP

回复 6楼 的帖子

回复的问题搞清楚了
因为自己的浏览器禁用JavaScript
所以点击回复后
“快速回复”里的标题出不来
看来Discuz的新版本确实修改了许多东西

TOP

回复 4楼 的帖子

能否请你讲解一下用&而不用&&在这里会有什么潜在的问题吗?
能否请你讲解一下用goto :input而不用goto input在这里会有什么潜在的问题吗?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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


太精辟了。。。

TOP

返回列表