无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 5290|回复: 10
打印 上一主题 下一主题

[已解决] 变量相关

[复制链接]
跳转到指定楼层
1#
发表于 2013-12-20 21:15:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 1549957235 于 2013-12-24 09:36 编辑

set myvar=%@root%
set myvar=%@roo^t%
第一个保存的是%@root%字符串
第二个保存的是根设备  对吗?
推荐
发表于 2013-12-23 14:01:01 | 只看该作者
stevenldj 发表于 2013-12-23 13:27
我的理解:
bootmgr=%@root^%  可以使 bootmgr 随着 @root 变化,如果 @root 发生变化,则 bootmgr 也跟着 ...

你需要理解的是call的作用和对变量的处理  一行命令里的变量在执行这行命令之前就已经被扩展了

假设当前root为(cd)   不存在变量bootroot

如果写成  find --set-root /bootmgr && set bootroot=%@root%

执行时被扩展为  find --set-root /bootmgr && set bootroot=(cd)  执行结果为变量bootroot的值是(cd)

如果写成  find --set-root /bootmgr && set bootroot=%@root^%

执行时被扩展为  find --set-root /bootmgr && set bootroot=%@root%  执行结果为变量bootroot的值是%@root%这个字符串  没有被扩展

如果写成  find --set-root /bootmgr && call set bootroot=%@root^%

执行时被扩展为 find --set-root /bootmgr && call set bootroot=%@root%

假设在(hd0,0)上找到了文件  那当前root为(cd)  执行find --set-root /bootmgr后当前root为(hd0,0)  执行call会进入新的环境  在新环境中先扩展call后面的set bootroot=%@root%命令为set bootroot=(hd0,0)  然后执行set bootroot=(hd0,0)  最终执行完毕后变量bootroot值为(hd0,0)

假如所有设备上都找不到/bootmgr文件  执行find --set-root /bootmgr会失败  不再执行&&符号后面的call set bootroot=%@root%  最终执行完毕后还是不存在变量bootroot

点评

我理解了,整行命令在执行之前会被解析,解析的过程中,会将其中的变量替换成实际的值。 %@root^% 的写法就是为了防止在解析命令行的时候将其扩展成实际的值,而是将其扩展成字符串 %@root%,以便下次解析的时候  详情 回复 发表于 2013-12-23 15:59

评分

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

查看全部评分

回复

使用道具 举报

2#
发表于 2013-12-21 12:32:40 | 只看该作者
正好相反  第一个是根设备  第二个是字符串  加^可以防止变量被扩展

点评

保存为字符串依然具有变量效果是吗? 你看看下面这个是对的吗? iftitle [find --set-root --devices=h /bootmgr && call set bootmgr=%@root^%] load BOOTMGR of Windows VISTA/WIN7/WIN2008 on %bootmgr% ch  详情 回复 发表于 2013-12-21 13:50
回复

使用道具 举报

3#
 楼主| 发表于 2013-12-21 13:50:53 | 只看该作者
sratlf 发表于 2013-12-21 12:32
正好相反  第一个是根设备  第二个是字符串  加^可以防止变量被扩展

保存为字符串依然具有变量效果是吗?  你看看下面这个是对的吗?
iftitle [find --set-root --devices=h /bootmgr && call set bootmgr=%@root^%] load BOOTMGR of Windows VISTA/WIN7/WIN2008 on %bootmgr%

chainloader %bootmgr%/bootmgr



那bootmgr=%@root^%替换为bootmgr=%@root%也没有影响吧

点评

保存成字符串就没有效果了 命令没什么问题 将bootmgr=%@root^%替换为bootmgr=%@root%那命令就不一定起作用了 因为在执行find --set-root --devices=h /bootmgr && call set bootmgr=%@root%之前 %@root%已  详情 回复 发表于 2013-12-23 09:27
回复

使用道具 举报

4#
发表于 2013-12-23 09:27:21 | 只看该作者
1549957235 发表于 2013-12-21 13:50
保存为字符串依然具有变量效果是吗?  你看看下面这个是对的吗?
iftitle [find --set-root --devices=h ...

保存成字符串就没有效果了  命令没什么问题

将bootmgr=%@root^%替换为bootmgr=%@root%那命令就不一定起作用了  

因为在执行find --set-root --devices=h /bootmgr && call set bootmgr=%@root%之前  %@root%已经被扩展成当前的root设备了  就算在其他设备上找到bootmgr文件  bootmgr变量的值也不会更新  还是find之前的root设备名
回复

使用道具 举报

5#
发表于 2013-12-23 13:27:59 | 只看该作者
我的理解:
bootmgr=%@root^%  可以使 bootmgr 随着 @root 变化,如果 @root 发生变化,则 bootmgr 也跟着变化,相当于 bootmgr 和 @root 绑定在一起了。
bootmgr=%@root%    使 bootmgr 只对 %@root% 取一次值,如果以后 @root 发生变化,则 bootmgr 不会随着变化。

点评

你需要理解的是call的作用和对变量的处理 一行命令里的变量在执行这行命令之前就已经被扩展了 假设当前root为(cd) 不存在变量bootroot 如果写成 find --set-root /bootmgr && set bootroot=%@root% 执  详情 回复 发表于 2013-12-23 14:01
回复

使用道具 举报

7#
发表于 2013-12-23 15:59:05 | 只看该作者
sratlf 发表于 2013-12-23 14:01
你需要理解的是call的作用和对变量的处理  一行命令里的变量在执行这行命令之前就已经被扩展了

假设当 ...

我理解了,整行命令在执行之前会被解析,解析的过程中,会将其中的变量替换成实际的值。

%@root^% 的写法就是为了防止在解析命令行的时候将其扩展成实际的值,而是将其扩展成字符串 %@root%,以便下次解析的时候继续扩展。

当 find --set-root /bootmgr 执行成功后,需要执行 && set bootroot=%@root% 的时候,又要执行一次解析,此时会将 %@root% 扩展成实际的值。

call 在这里是为了刷新环境变量。


回复

使用道具 举报

8#
 楼主| 发表于 2013-12-24 09:33:51 | 只看该作者
本帖最后由 1549957235 于 2013-12-24 09:35 编辑

谢谢两位,通过实际测试我也理解了。
命令行执行时是将整行输入执行的,对于这一行命令:iftitle [find --set-root --devices=h /bootmgr && call set bootmgr=%@root^%]
先进行查找和赋值,最后刷新变量。
不管是缺少了call  还是将%@root^%改为%@root%  %bootmgr%显示的都是(ud)
回复

使用道具 举报

9#
发表于 2013-12-24 11:58:45 | 只看该作者
这样子复杂了。我已回复:
http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1

点评

不复杂 有的时候必须用call 不能用&; &;前命令为真的话表示后续命令都可执行 有时会出现逻辑错误  详情 回复 发表于 2013-12-24 14:45
回复

使用道具 举报

10#
发表于 2013-12-24 14:45:23 | 只看该作者
pseudo 发表于 2013-12-24 11:58
这样子复杂了。我已回复:
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=323088&extra=page%3D1

不复杂  有的时候必须用call  不能用&;  

&;前命令为真的话表示后续命令都可执行  有时会出现逻辑错误

点评

还有这种事  详情 回复 发表于 2013-12-24 17:02
回复

使用道具 举报

11#
 楼主| 发表于 2013-12-24 17:02:26 | 只看该作者
sratlf 发表于 2013-12-24 14:45
不复杂  有的时候必须用call  不能用&;  

&;前命令为真的话表示后续命令都可执行  有时会出现逻辑错误

还有这种事
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-16 03:51

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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