标题: [其他] [疑问]调用批处理时的管道信息传递 [打印本页]
作者: 523066680 时间: 2010-1-11 18:29 标题: [疑问]调用批处理时的管道信息传递
我这里有一个临时打开快递链接的批处理- @echo off
- echo,
- echo, deppon - 德邦
- echo, lbex - 龙邦
- echo, sf - 顺丰
- echo, yunda - 韵达
- echo, fengda - 丰达
- echo, lts - 联昊通
- echo, jiaji - 佳吉
- echo,
- echo,退出 exit
- echo,
-
- set deppon="http://www.deppon.com/"
- set lbex="http://www.lbex.com.cn/"
- set sf="http://www.sf-express.com/"
- set yunda="http://www.yundaex.com/"
- set fengda="http://www.fd168.com.cn/"
- set lts="http://lts.com.cn/web/index.asp"
- set jiaji="http://www.jiaji.com"
- :input
- set /p inp="Input:"
- if "%inp%"=="exit" (exit)
- if not defined %inp% (echo,请输入一个已有的选项,谢谢。&goto :input)
- call :next %%%inp%%%
- exit
-
- :next
- 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
- 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://bathome.net./) |
Powered by Discuz! 7.2 |