- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这段代码
@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
为什么会有差异,如何达到预期的效果?
最佳答案
问题是 set myvar=!myvar!
扩展为 set myvar=first
,
你用相同的内容设置它,然后你要求 echo myvar:!myvar!
显示 myvar 的内容。
我会尝试添加更多解释,即使 Aacini 和 shf301 已经回答了这个问题。
两者都显示了使用 !%var%!
构造的双重扩展,Aacini 解释了为什么它可以工作,以及为什么反向版本 %!var!%
可以'工作。
恕我直言,有四种不同的扩展。
延迟扩张:
正如 Aacini 所解释的那样,延迟扩展对于内容中的任何特殊字符都是安全的(它可以处理从 0x01 到 0xFF 的所有字符)。
膨胀百分比:
百分比扩展无法处理或删除某些字符(即使转义)。
它对于简单的内容很有用,因为它可以在 endlocal
屏障之后扩展变量。
setlocal
set "myVar=simple content"
(
endlocal
set result=%myVar%
)
FOR 循环参数扩展:
这是安全的,如果延迟扩展被禁用,否则延迟扩展阶段在 %%a 变量扩展之后执行。
它很有用,因为它可以在 endlocal
屏障之后扩展变量
setlocal EnableDelayedExpansion
set "var=complex content &<>!"
for /F "delims=" %%A in ("!var!") DO (
endlocal
set "result=%%A"
)
SET 扩展:set var
也扩展了一个变量,它始终是安全的并且独立于延迟扩展模式工作。
Aacini 刚刚解释了call %%%var%%%
构造是如何工作的,我只想给出一些额外的评论。call
是可堆叠的,您可以使用其中的许多调用,并且每次调用都会重新启动解析器。
set "var=%%var%%#"
call call call call call echo %var%
结果为 %var%######
但是调用
有很多缺点/副作用!
每次调用都加倍所有插入符号 ^
你可以说:“嘿,我已经测试过了,我看不到任何加倍”
call call call call echo ^^
结果 ^
尽管如此,但它大部分是隐藏的,因为每次重新启动也有一个特殊的字符阶段,其中插入符转义下一个字符,但您可以看到加倍效果
call call call call echo "^^"^^
结果 "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"^
即使调用扩展重新启动解析器,您也永远不能在任何阶段(仅在第一个阶段)使用延迟扩展。
如果检测到未转义的特殊字符,call
将停止工作。
echo you ^& me
call echo you & me
call echo you ^& me
call echo you ^^& me
call echo you ^^^& me
只有第一个结果输出you & me
,其他的都失败了。
另一个问题是调用非常慢,call var=content
比 set var=content
慢 ~50 倍,原因是 call try to start一个外部程序。
@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?
关于windows - 为什么在这种情况下批处理文件中的延迟扩展不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7882395/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!