无忧启动论坛

标题: 帮助文档错误? call命令的使用 [打印本页]

作者: 1549957235    时间: 2013-12-20 21:39
标题: 帮助文档错误? call命令的使用
本帖最后由 1549957235 于 2013-12-24 16:59 编辑

iftitle [find --set-root --devices=h /bootmgr && call set bootmgr=%@root^%] load BOOTMGR of Windows VISTA/WIN7/WIN2008 on %bootmgr%
call不是用在批处理中吗?指定跳转吗?为什么用在了set前面,set也没有相关用法啊
作者: 神的马甲    时间: 2013-12-20 22:11
假设,启动设备为(ud),bootmgr存在于(hd0,0)


第一种情况,去掉call,即 find --set-root --devices=h /bootmgr && set bootmgr=%@root%,那么,%@root%为(ud)


第二种情况,加上call,即 find --set-root --devices=h /bootmgr && call set bootmgr=%@root^%,那么,%@root%为(hd0,0)


上述现象叫做变量延迟,与WINDOWS下的命令行一样,详细请看:
http://www.bathome.net/redirect. ... =2189&pid=12586
作者: 1549957235    时间: 2013-12-21 11:32
神的马甲 发表于 2013-12-20 22:11
假设,启动设备为(ud),bootmgr存在于(hd0,0)

哦  呵呵原来如此  可是call不是没有标签  这样不会出错吗?
改用clear行吗?
作者: sratlf    时间: 2013-12-21 12:42
1549957235 发表于 2013-12-21 11:32
哦  呵呵原来如此  可是call不是没有标签  这样不会出错吗?
改用clear行吗?

call在批处理中使用才需要跟标签名  在命令中可以不用加  用clear不可以  用call是因为可以进入新的环境  变量值都更新了  所以可以得到新的变量值  其他的命令没有这个功能
作者: 1549957235    时间: 2013-12-21 13:43
sratlf 发表于 2013-12-21 12:42
call在批处理中使用才需要跟标签名  在命令中可以不用加  用clear不可以  用call是因为可以进入新的环境  ...

也就是说 iftitle []  整体执行  读到call时进入新环境  使变量更新
这才使得变量为(hd0,0)
这个问题是不是懂批处理才能理解啊?
作者: pseudo    时间: 2013-12-21 17:47

&&
换成
&;
试试。
作者: 1549957235    时间: 2013-12-21 18:20
pseudo 发表于 2013-12-21 17:47

&&
换成

这个符号好像是与吧

我试过了不行,本来还可以显示出title
用了之后就显示不出来了,不管是去掉call还是没去掉的
作者: stevenldj    时间: 2013-12-21 18:40
神的马甲 发表于 2013-12-20 22:11
假设,启动设备为(ud),bootmgr存在于(hd0,0)

第一种情况,去掉call,即 find --set-root --devices=h /bootmgr && set bootmgr=%@root%,那么,%@root%为(ud)

第二种情况,加上call,即 find --set-root --devices=h /bootmgr && call set bootmgr=%@root^%,那么,%@root%为(hd0,0)


第一种情况:%@root%
第二种情况:%@root^%

为什么第二种情况不解引 @root 变量
作者: sratlf    时间: 2013-12-23 09:22
1549957235 发表于 2013-12-21 13:43
也就是说 iftitle []  整体执行  读到call时进入新环境  使变量更新
这才使得变量为(hd0,0)
这个问题 ...

和批处理没关系  就是call的特殊用法
作者: sratlf    时间: 2013-12-23 09:23
stevenldj 发表于 2013-12-21 18:40
第一种情况:%@root%
第二种情况:%@root^%

你可以理解为强制规定  变量名中间加入^该变量就不会被扩展
作者: pseudo    时间: 2013-12-24 11:54
1549957235 发表于 2013-12-21 18:20
这个符号好像是与吧

我试过了不行,本来还可以显示出title

set x=0
set x=1 && echo x=%x%
set x=2 &; echo x=%x%
pause
作者: stevenldj    时间: 2013-12-24 13:59
原来 &; 还有刷新环境变量的功能,学习了!
作者: stevenldj    时间: 2013-12-24 14:17
本帖最后由 stevenldj 于 2013-12-24 14:20 编辑

似乎还有些问题:

if 1==1 && echo ok ! echo fail
输出 ok

if 1==2 && echo ok ! echo fail
输出 fail

if 1==1 &; echo ok ! echo fail
输出 ok

if 1==2 &; echo ok ! echo fail
不输出

if 1==2 &; echo ok || echo fail
不输出

if 1==2 && echo ok || echo fail
不输出

将 if 换成 checkrange 判断也是同样的结果,这些基本语法都把人搞的晕晕的。



作者: sratlf    时间: 2013-12-24 15:02
stevenldj 发表于 2013-12-24 14:17
似乎还有些问题:

if 1==1 && echo ok ! echo fail

这次你是&;的作用没弄明白  以前就曾经在某个帖子的回复里写过&;和&&的区别  忘记在哪了。。。

&;符号和|;符号是chenall在;;符号之后添加的命令符  理解&;符号和|;符号前需要明白;;的作用  不能直接和&&及||相联系

简单的说;;表示该符号后的命令总会得到执行  无论;;前的命令是真还是假  同时变量值会被刷新  通常用在只能执行一行命令  同时命令里还包含变量的情况下

&;符号表示该符号后的所有命令会在符号前命令为真的时候执行  同时变量值会被刷新

同样的|;符号表示该符号后的所有命令会在符号前命令为假的时候执行  同时变量值会被刷新

if 1==1 &; echo ok ! echo fail  
这里1等于1  所有继续执行&;后面的 echo ok ! echo fail 命令  肯定会输出ok  fail肯定不会得到输出

if 1==2 &; echo ok ! echo fail
if 1==2 &; echo ok || echo fail
这里1不等于2  那&;后面的命令 echo ok ! echo fail 或者 echo ok || echo fail 都不会得到执行  不会输出任何字符

if 1==2 && echo ok || echo fail
这里1不等于2  那&&后面的 echo ok 不会得到执行  相应的||符号会因为前面的echo ok没有被执行无法判断是真还是假  也将不执行||后面的 echo fail

所以看上去最后两种写法结果一样  都没有输出字符  其实原因是完全不同的
作者: stevenldj    时间: 2013-12-24 15:39
要是再来个 !; 就完美了。

if 1==2 &; echo ok !; echo fail
作者: sratlf    时间: 2013-12-24 16:02
stevenldj 发表于 2013-12-24 15:39
要是再来个 !; 就完美了。

if 1==2 &; echo ok !; echo fail

!;能有什么作用吗。。。如果合理的话可以问下chenall能否加入
作者: stevenldj    时间: 2013-12-24 16:09
本帖最后由 stevenldj 于 2013-12-24 16:11 编辑

cat --locate=abc /File &; set Last=%?% !; set Last=-1
这样可以判断 cat --locate=abc /File 是否找到了 abc 字符串。

cat --locate=abc /File ;; set Last=%?%
这样写,如果 cat --locate=abc /File 找不到 abc 字符串,则 %?% 的值不确定,有时为空,有时为其他值。

当然,如果绕个弯也能实现:
cat --locate=abc /File && set Last=   !   set Last=-1
if not exist Last set Last=%?%



作者: 1549957235    时间: 2013-12-24 16:56
pseudo 发表于 2013-12-24 11:54
set x=0
set x=1 && echo x=%x%
set x=2 &; echo x=%x%

哦  错当成&这个了
作者: 1549957235    时间: 2013-12-24 16:59
想不到问一个call引出这么多东西来,这些都跟批处理 dos有关系吧  
作者: sratlf    时间: 2013-12-24 17:10
stevenldj 发表于 2013-12-24 16:09
cat --locate=abc /File &; set Last=%?% !; set Last=-1
这样可以判断 cat --locate=abc /File 是否找到 ...


cat --locate=abc /File && set Last= &; set Last=%?% ! set Last=-1  没测试。。。
作者: stevenldj    时间: 2013-12-24 17:56
本帖最后由 stevenldj 于 2013-12-24 18:07 编辑

用下面的代码测试,不成功:

set Last=Temp ;; cat --locate=abc /grldr > nul && set Last= &; set Last=%?% ! set Last=-1 ;; set
可以找到 abc,输出:Last=0x375a6

set Last=Temp ;; cat --locate=aabbcc /grldr > nul && set Last= &; set Last=%?% ! set Last=-1 ;; set
找不到 aabbcc,输出:Last=Temp,而不是 Last=-1




作者: sratlf    时间: 2013-12-24 23:46
那可以简化下 set Last=-1 && cat --locate=abc /grldr &; set Last=%?%
作者: sratlf    时间: 2013-12-25 01:12
或者说是cat --locate=abc /grldr || set Last=-1 ! set Last= &; set Last=%?%




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3