|
|
发表于 2026-8-28 21:11:01
|
显示全部楼层
本帖最后由 aloha20200628 于 2026-8-29 13:29 编辑
先看以下三个示例,其后再给解释说明...
一。(正常运行)
- @echo off &set y="test" &set x=4
- if "%x%" equ "4" (set "z=%y:"=""%")
- echo,%z%
- pause&exit/b
复制代码
二。(无报错退出)
- @echo off &set y="test" &set x=4
- setlocal enabledelayedexpansion
- if "%x%" equ "4" (set z=!y:"=""!)
- echo,%z%
- pause&exit/b
复制代码
三。(正常运行)
- @echo off &set y="test" &set x=4
- setlocal enabledelayedexpansion
- if "%x%" equ "4" (set z=!y:"=""!)
- )
- echo,%z%
- pause&exit/b
复制代码
根据以上示例解释说明如下》
预处理只会预先扩展被括号对包裹其内的 %y% 实值,而无视其内的延迟变量实值,如果其内只有 %y% 变量,预处理可以明确解析其内全部双引号的真实个数及位置关系,所以,示例一运行正常;
但如果其内包含延迟变量,该实值就不会被预处理预先扩展,导致预处理不能明确解析其内全部双引号的真实个数及位置关系,而只能在实时运行时依法处理,针对赋值表达式 set ... 的处理法则之一,即源赋值表达式中最后一个双引号若是偶数位,则其后的语义符如 ) 就会发挥语义作用(不会被转义);否则(即奇数位),赋值结果就会一直扩展延续到行尾,因此原有的语义符 ) 会被丢失而变为赋值结果的最后部分,所以,示例二会无报错退出(但实因是丢失了末尾 ) 这个语义符)。
为证明上述结论,看示例三结果显示,%z% 最终返回值结尾多了一个 ) 字符,而真正能使示例三正常运行的是第4行追加的 ) 字符。
以上解释说明应可理清一楼各例所述怪相... |
|