3

当我将驱动器号存储%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:\

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

4

3 回答 3

4

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

这种情况可以解释pushd(或cd顺便说一句)如何工作

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\
于 2013-02-14T10:14:07.427 回答
1

你为什么期待Current: C:\
您从C:\Temp\Test.
所以%CD%扩展为是正确的C:\Temp\Test

如果您希望%CD%在使用时会发生变化,则PUSHD %target%需要拆分行,或使用延迟扩展 for !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^^!
于 2013-02-14T09:19:20.793 回答
0

我无法向您解释这种行为,但您可以使用以下方法模仿它:

pushd %Target%
if %ERRORLEVEL%==0 (echo Current: %CD%) else (echo Failed to change dir!)
于 2013-02-14T08:44:07.370 回答