当我将%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:\
我也尝试使用延迟扩展的相同代码,但这也不起作用。谁能解释一下这里发生了什么?
答案 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!)