加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 为什么批处理文件中的延迟扩展在这种情况下不起作用

发布时间:2020-12-14 05:46:23 所属栏目:Windows 来源:网络整理
导读:这段代码 @echo offsetlocal EnableDelayedExpansionset myvar=firstset first=secondecho myvar:!myvar!set myvar=!myvar!echo myvar:!myvar! 给 myvar:firstmyvar:first 在Windows Vista SP2上. 我预期的输出是 myvar:firstmyvar:second 为什么差异以及如
这段代码

@echo off
setlocal EnableDelayedExpansion

set myvar=first
set first=second

echo myvar:!myvar!
set myvar=!myvar!
echo myvar:!myvar!

myvar:first
myvar:first

在Windows Vista SP2上.

我预期的输出是

myvar:first
myvar:second

为什么差异以及如何获得理想的效果?

解决方法

问题是设置myvar =!myvar!扩展设置myvar = first,
你用相同的内容设置它,然后你问echo myvar:!myvar!显示myvar的内容.

我会尝试添加更多解释,即使Aacini和shf301已经回答了这个问题.

两者都显示了!%var%的双重扩张!构造,Aacini解释了为什么它可以工作,以及为什么反转版本%!var!%无法工作.

恕我直言,有四种不同的扩展.
延迟扩展:
正如Aacini所解释的那样,延迟扩展对内容中的任何特殊字符都是安全的(它可以处理从0x01到0xFF的所有字符).

扩展百分比:
扩展百分比无法处理或删除某些字符(即使转义).
它对简单内容很有用,因为它可以在一个终点障碍之后扩展变量.

setlocal
set "myVar=simple content"
(
endlocal
set result=%myVar%
)

FOR-Loop-Parameters扩展:
如果禁用延迟扩展,则是安全的,否则延迟扩展阶段在%% a变量扩展后执行.
它可能很有用,因为它可以在一个终点屏障后扩展变量

setlocal EnableDelayedExpansion
set "var=complex content &<>!"
for /F "delims=" %%A in ("!var!") DO (
  endlocal
  set "result=%%A"
)

SET扩展:
set var也是一个变量,它始终是安全的,并且与延迟扩展模式无关.

Aacini刚刚解释了如何调用%%% var %%%构造工作,我只想给出一些额外的评论.
call是可堆叠的,你可以使用其中的许多,每次重启解析器.

set "var=%%var%%#"
call call call call call echo %var%

结果为%var%######

但是电话有许多缺点/副作用!
每个电话双倍所有插入符号^
你可以说:“嘿,我测试了它,我看不到任何加倍”

call call call call echo ^^

结果^

不过这是真的,但它主要是隐藏的,因为每次重启都有一个特殊的角色阶段,插入符号会逃脱下一个角色,但你可以看到加倍效果

call call call call echo "^^"^^

结果“^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^”^

即使调用扩展重新启动解析器,也不能在任何阶段使用延迟扩展(仅在第一个阶段).

如果检测到未转义的特殊字符,则呼叫将停止工作.

echo you ^& me
call echo you & me
call echo you ^& me
call echo you ^^& me
call echo you ^^^& me

只有第一个产生输出你和&我,所有其他人都失败了.

另一个问题是调用极其缓慢,调用集var = content比set var = content慢50倍,原因是调用尝试启动外部程序.

@echo off
setlocal
(
   echo echo *** External batch,parameters are '%%*'
) > set.bat
set "var="
call set var=hello
set var

我希望它有点有趣……
如果你想更深入,你可以阅读CALL me,or better avoid call
和How does the Windows Command Interpreter (CMD.EXE) parse scripts?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读