无忧启动论坛

标题: 变量相关 [打印本页]

作者: 1549957235    时间: 2013-12-20 21:15
标题: 变量相关
本帖最后由 1549957235 于 2013-12-24 09:36 编辑

set myvar=%@root%
set myvar=%@roo^t%
第一个保存的是%@root%字符串
第二个保存的是根设备  对吗?
作者: sratlf    时间: 2013-12-21 12:32
正好相反  第一个是根设备  第二个是字符串  加^可以防止变量被扩展
作者: 1549957235    时间: 2013-12-21 13:50
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%也没有影响吧

作者: sratlf    时间: 2013-12-23 09:27
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设备名
作者: stevenldj    时间: 2013-12-23 13:27
我的理解:
bootmgr=%@root^%  可以使 bootmgr 随着 @root 变化,如果 @root 发生变化,则 bootmgr 也跟着变化,相当于 bootmgr 和 @root 绑定在一起了。
bootmgr=%@root%    使 bootmgr 只对 %@root% 取一次值,如果以后 @root 发生变化,则 bootmgr 不会随着变化。
作者: sratlf    时间: 2013-12-23 14: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

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

假设当 ...

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

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

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

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



作者: 1549957235    时间: 2013-12-24 09:33
本帖最后由 1549957235 于 2013-12-24 09:35 编辑

谢谢两位,通过实际测试我也理解了。
命令行执行时是将整行输入执行的,对于这一行命令:iftitle [find --set-root --devices=h /bootmgr && call set bootmgr=%@root^%]
先进行查找和赋值,最后刷新变量。
不管是缺少了call  还是将%@root^%改为%@root%  %bootmgr%显示的都是(ud)
作者: pseudo    时间: 2013-12-24 11:58
这样子复杂了。我已回复:
http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
作者: sratlf    时间: 2013-12-24 14:45
pseudo 发表于 2013-12-24 11:58
这样子复杂了。我已回复:
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=323088&extra=page%3D1

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

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

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

还有这种事




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