Windows批量变量扩展无法正常工作

时间:2013-02-14 08:27:08

标签: batch-file cmd

当我将%0的驱动器信息存储到变量中时,我遇到了一些意想不到的输出。

以下代码段从 C:\ Temp \ Test

运行
@echo off
for %%I in ("%~0") do set "Target=%%~dI"
echo Target:  %Target%
pushd %Target% && echo Current: %CD% || echo Failed to change dir!

这将为Target打印正确的值,但不会为当前目录打印:

Target:  C:
Current: C:\Temp\Test

预期产出:

Target:  C:
Current: C:\

我也尝试使用延迟扩展的相同代码,但这也不起作用。谁能解释一下这里发生了什么?

3 个答案:

答案 0 :(得分:4)

您的问题不在于变量扩展,而在于pushd行为。

此方案可以解释pushd(或cd btw)的工作原理

C:\>cd temp
C:\temp>_

现在%cd%c:\temp。如果你“移动”到另一个驱动器

C:\temp>e:

并尝试

E:\>pushd c:
C:\temp>_

现在看到%cd%已回归C:\temp,而不是您所期望的C:\

但是

C:\temp>e:
E:\>pushd c:\
C:\>_

按照您的预期将%cd%带到C:\

因此,您的.BAT文件可以简单地写为

pushd %~d0\

答案 1 :(得分:1)

为什么期望Current: C:\
您从C:\Temp\Test运行脚本 因此%CD%扩展为C:\Temp\Test是正确的。

如果您预计%CD%应该在使用PUSHD %target%时更改,则需要拆分该行,或使用!CD!的延迟扩展,因为首先会解析完整的行并且在执行PUSHD之前完成百分比扩展。

另一个问题是pushd C:不会更改路径,因为C:是相对路径,您需要使用C:\

@echo off
set "Target=%~d0\"
setlocal EnableDelayedExpansion
echo Target:  %Target%
pushd %Target% && echo Current: !CD! || echo Failed to change dir^^!

答案 2 :(得分:0)

我无法解释你这种行为,但你可以使用:

来模仿它
pushd %Target%
if %ERRORLEVEL%==0 (echo Current: %CD%) else (echo Failed to change dir!)