|
|
本帖最后由 87zrjojo 于 2026-8-28 15:35 编辑
我在测试一个批处理时,遇到一个奇葩的问题,我想通过SET命令将单个引号 " 替换为多个引号,发现在未开启变量延迟时能正常替换,但如果开启变量延迟并使用 ! 引用变量执行替换时,就会出错。这是个什么原理,大家帮忙解答一下。以下是我测试的代码
- @ECHO OFF
- set argv="test"
- REM x分别设置1-4进行测试
- set x=4
- REM 方式一:不开启变量延迟时
- IF "%x%"=="1" (set argv=%argv:"="""%)
- IF "%x%"=="2" (set argv=%argv:"=""%)
- echo argv=%argv% 测试x=1或x=2都没问题
- REM 方式二:开启变量延迟且使用!引用变量时
- SETLOCAL ENABLEDELAYEDEXPANSION
- IF "%x%"=="3" (set argv=!argv:"="""!)
- IF "%x%"=="4" (set argv=!argv:"=""!)
- echo argv=%argv% 测试x=3没问题,但x=4会闪退
- REM x=4时,如果使用%引用变量不会有问题(比如set argv=%argv:"=""%)
- REM 如果改为set argv=!argv:^"=""!,测试也正常的,这是个什么原理?
- pause
复制代码
上面代码,在x=4时就会一闪而过,肯定是代码出错了,这时我在替换时将引号转义^”一下就执行正确了,这是为什么?什么原理!
在代码中难免不了会使用!var!变量延迟,但上面的示例也真是奇葩,在不同环境下行为表现不一致,我是在win7中测试的,不知其它系统中是不是也这样?
论坛里的大神多,求指教! |
|