为什么使用 SETLOCAL ENABLEDELAYEDEXPANSION 时更改目录不起作用

为什么使用 SETLOCAL ENABLEDELAYEDEXPANSION 时更改目录不起作用

我有一个现有的 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脚本终止时被撤消了。

相关内容