我有一个现有的 Windows 批处理脚本(名为 test1.bat),如下所示:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set nop=4
for /l %%z in (1, 1, %nop%) do (
set x=%%z
echo !x!
)
chdir /d D:\app\
奇怪的是,出于某种原因,chdir
最后的命令没有将目录更改为D:\app\
。它甚至没有抛出错误,脚本就完成了。但是当我删除时,SETLOCAL ENABLEDELAYEDEXPANSION
命令chdir
运行正常。
我想知道为什么chdir
使用时命令不起作用SETLOCAL ENABLEDELAYEDEXPANSION
?
以下是带有输出的完整代码
当 test1.bat 使用SETLOCAL ENABLEDELAYEDEXPANSION
C:\tmp>@test1.bat
1
2
3
4
C:\tmp>
当 test1.bat 没有SETLOCAL ENABLEDELAYEDEXPANSION
C:\tmp>@test1.bat
!x!
!x!
!x!
!x!
D:\app>
答案1
这个问题在 stackoverflow 上已经回答过了这里答案的相关部分如下:
唯一不明显的是“环境变化的本地化”不仅包括环境变量,还包括当前目录以及延迟扩展和扩展状态。
因此,你需要在更改目录之前“endlocal”,从而使你的脚本
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set nop=4
for /l %%z in (1, 1, %nop%) do (
set x=%%z
echo !x!
)
endlocal
chdir /d D:\app\
答案2
ENABLEDELAYEDEXPANSION
是传递给
SETLOCAL 命令。导致问题的不是这个参数,而是命令本身。(尝试setlocal
不带任何参数,看看是否会发生相同的事情。)
该setlocal
命令描述如下:
开始对批处理文件中的环境变量进行本地化。本地化将持续进行,直到遇到匹配的 endlocal 命令或到达批处理文件的末尾。
具体来说,这意味着如果你setlocal
在脚本中使用,所有环境变量的更改都是最终迷失除非你
采取措施。
返回的变量之一是
CD 环境变量
它保存当前目录。这意味着返回当前目录,不再是
D:\APP
。命令似乎CD
失败了,但实际上它确实起作用了,只是在.bat
脚本终止时被撤消了。