批处理文件在 cd 命令后获取当前工作目录

Batch file get present working directory after cd command

当我 运行 位于 C:\some\dir 中的批处理文件时,我知道我可以使用 %cd%%~dp0 来获取批处理文件本身和其他文件的路径描述的信息 here.

但是在批处理文件执行了几个 cd 命令后,我还没有设法获得 "present working directory"。

例如:

我如何获得那个文件夹的路径?

它应该产生 C:\some\dir\sub\sub2 并且在命令行中手动执行上述所有操作时相当于 pwd 命令!

上面的任何命令我都不走运!它说 here %cd% 变量应该在使用 cd 命令后更新,但我总是得到 C:\some\dir 作为输出。

编辑

link to a short version of my batch file

I) 你可以在脚本开头保留当前目录:

@echo off
set "curr_dir=%cd%"
...some cd commands...
cd /d "%curr_dir%" 

II)你可以用pushd/popd(可能更好)...

@echo off
....
pushd sub
...some commands...
popd
pushd sub2
...some commands...
popd

...或者像这样,如果给定的子目录可能不存在:

@echo off
....
pushd .
cd /D sub
...some commands...
popd
pushd .
cd /D sub2
...some commands...
popd

解释: 假设您成功将 sub 推送到目录堆栈但无法找到 sub2,因此 pushd sub2 失败并且没有推送任何内容,下一个 popd 无意中取消推送 sub ;推送当前目录 pushd . 但是永远不会失败...

more info

如果您的批处理文件执行如下操作:

@echo off
echo Start at: %cd%

cd sub
cd sub2

echo Currently at: %cd%

第二个echo命令肯定会显示C:\some\dir\sub\sub2。但是,如果 %cd% 放在 代码块 中,即用括号括起来(就像在 iffor 命令中),那么这就是经典的延迟扩展问题(如 MC ND 所示):

@echo off
setlocal EnableDelayedExpansion

>log.txt (
   cd sub
   cd sub2

   echo Before this code block the current directory was: %cd%
   echo But currently it is: !cd!
)

有关更多详细信息,请查找 "delayed expansion"。