无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 5874|回复: 33
打印 上一主题 下一主题

[已解决] 帮助文档错误? call命令的使用

[复制链接]
跳转到指定楼层
1#
发表于 2013-12-20 21:39:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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也没有相关用法啊
2#
发表于 2013-12-20 22:11:46 | 只看该作者
假设,启动设备为(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

点评

第一种情况:%@root% 第二种情况:%@root^% 为什么第二种情况不解引 @root 变量  详情 回复 发表于 2013-12-21 18:40
哦 呵呵原来如此 可是call不是没有标签 这样不会出错吗? 改用clear行吗?  详情 回复 发表于 2013-12-21 11:32
回复

使用道具 举报

3#
 楼主| 发表于 2013-12-21 11:32:37 | 只看该作者
神的马甲 发表于 2013-12-20 22:11
假设,启动设备为(ud),bootmgr存在于(hd0,0)

哦  呵呵原来如此  可是call不是没有标签  这样不会出错吗?
改用clear行吗?

点评

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

使用道具 举报

4#
发表于 2013-12-21 12:42:20 | 只看该作者
1549957235 发表于 2013-12-21 11:32
哦  呵呵原来如此  可是call不是没有标签  这样不会出错吗?
改用clear行吗?

call在批处理中使用才需要跟标签名  在命令中可以不用加  用clear不可以  用call是因为可以进入新的环境  变量值都更新了  所以可以得到新的变量值  其他的命令没有这个功能

点评

也就是说 iftitle [] 整体执行 读到call时进入新环境 使变量更新 这才使得变量为(hd0,0) 这个问题是不是懂批处理才能理解啊?  详情 回复 发表于 2013-12-21 13:43
回复

使用道具 举报

5#
 楼主| 发表于 2013-12-21 13:43:55 | 只看该作者
sratlf 发表于 2013-12-21 12:42
call在批处理中使用才需要跟标签名  在命令中可以不用加  用clear不可以  用call是因为可以进入新的环境  ...

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

点评

和批处理没关系 就是call的特殊用法  详情 回复 发表于 2013-12-23 09:22
回复

使用道具 举报

6#
发表于 2013-12-21 17:47:25 | 只看该作者

&&
换成
&;
试试。

点评

这个符号好像是与吧 我试过了不行,本来还可以显示出title 用了之后就显示不出来了,不管是去掉call还是没去掉的  详情 回复 发表于 2013-12-21 18:20
回复

使用道具 举报

7#
 楼主| 发表于 2013-12-21 18:20:51 | 只看该作者

这个符号好像是与吧

我试过了不行,本来还可以显示出title
用了之后就显示不出来了,不管是去掉call还是没去掉的

点评

set x=0 set x=1 && echo x=%x% set x=2 &; echo x=%x% pause  详情 回复 发表于 2013-12-24 11:54
回复

使用道具 举报

8#
发表于 2013-12-21 18:40:50 | 只看该作者
神的马甲 发表于 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 变量

点评

你可以理解为强制规定 变量名中间加入^该变量就不会被扩展  详情 回复 发表于 2013-12-23 09:23
回复

使用道具 举报

9#
发表于 2013-12-23 09:22:44 | 只看该作者
1549957235 发表于 2013-12-21 13:43
也就是说 iftitle []  整体执行  读到call时进入新环境  使变量更新
这才使得变量为(hd0,0)
这个问题 ...

和批处理没关系  就是call的特殊用法
回复

使用道具 举报

10#
发表于 2013-12-23 09:23:53 | 只看该作者
stevenldj 发表于 2013-12-21 18:40
第一种情况:%@root%
第二种情况:%@root^%

你可以理解为强制规定  变量名中间加入^该变量就不会被扩展
回复

使用道具 举报

11#
发表于 2013-12-24 11:54:06 | 只看该作者
1549957235 发表于 2013-12-21 18:20
这个符号好像是与吧

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

set x=0
set x=1 && echo x=%x%
set x=2 &; echo x=%x%
pause

点评

哦 错当成&这个了  详情 回复 发表于 2013-12-24 16:56

评分

参与人数 1无忧币 +5 收起 理由
1549957235 + 5

查看全部评分

回复

使用道具 举报

12#
发表于 2013-12-24 13:59:04 | 只看该作者
原来 &; 还有刷新环境变量的功能,学习了!
回复

使用道具 举报

13#
发表于 2013-12-24 14:17:05 | 只看该作者
本帖最后由 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 判断也是同样的结果,这些基本语法都把人搞的晕晕的。


点评

这次你是&;的作用没弄明白 以前就曾经在某个帖子的回复里写过&;和&&的区别 忘记在哪了。。。 &;符号和|;符号是chenall在;;符号之后添加的命令符 理解&;符号和|;符号前需要明白;;的作用 不能直接和&&及||相联  详情 回复 发表于 2013-12-24 15:02
回复

使用道具 举报

14#
发表于 2013-12-24 15:02:01 | 只看该作者
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

所以看上去最后两种写法结果一样  都没有输出字符  其实原因是完全不同的

点评

谢谢 sratlf 版主的指点,完全明白了。  发表于 2013-12-24 15:14

评分

参与人数 1无忧币 +5 收起 理由
1549957235 + 5

查看全部评分

回复

使用道具 举报

15#
发表于 2013-12-24 15:39:23 | 只看该作者
要是再来个 !; 就完美了。

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

点评

!;能有什么作用吗。。。如果合理的话可以问下chenall能否加入  详情 回复 发表于 2013-12-24 16:02
回复

使用道具 举报

16#
发表于 2013-12-24 16:02:16 | 只看该作者
stevenldj 发表于 2013-12-24 15:39
要是再来个 !; 就完美了。

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

!;能有什么作用吗。。。如果合理的话可以问下chenall能否加入
回复

使用道具 举报

17#
发表于 2013-12-24 16:09:36 | 只看该作者
本帖最后由 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=%?%


点评

cat --locate=abc /File && set Last= &; set Last=%?% ! set Last=-1  详情 回复 发表于 2013-12-24 17:10
回复

使用道具 举报

18#
 楼主| 发表于 2013-12-24 16:56:45 | 只看该作者
pseudo 发表于 2013-12-24 11:54
set x=0
set x=1 && echo x=%x%
set x=2 &; echo x=%x%

哦  错当成&这个了
回复

使用道具 举报

19#
 楼主| 发表于 2013-12-24 16:59:28 | 只看该作者
想不到问一个call引出这么多东西来,这些都跟批处理 dos有关系吧  
回复

使用道具 举报

20#
发表于 2013-12-24 17:10:32 | 只看该作者
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  没测试。。。
回复

使用道具 举报

21#
发表于 2013-12-24 17:56:22 | 只看该作者
本帖最后由 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



回复

使用道具 举报

22#
发表于 2013-12-24 23:46:04 来自手机 | 只看该作者
那可以简化下 set Last=-1 && cat --locate=abc /grldr &; set Last=%?%

点评

谢谢 sratlf 版主指点,学习了!  发表于 2013-12-25 09:35
回复

使用道具 举报

23#
发表于 2013-12-25 01:12:50 来自手机 | 只看该作者
或者说是cat --locate=abc /grldr || set Last=-1 ! set Last= &; set Last=%?%
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-2 13:24

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表