当我运行位于C:\some\dir
的批处理文件时,我知道我可以使用%cd%
和%~dp0
来获取批处理文件本身的路径以及所描述的其他信息{{3 }}
但我还没有设法获得"目前的工作目录"批处理文件执行了几个cd
命令后。
例如:
C:\some\dir
cd sub
及更晚cd sub2
我如何获得该文件夹的路径?
在命令行中手动执行以上所有操作时,它应该产生C:\some\dir\sub\sub2
并且等同于pwd
命令!
上面的任何命令都没有运气!它说here %cd%
变量应该在使用cd
命令后更新,但我总是以C:\some\dir
作为输出。
修改
答案 0 :(得分:3)
如果您的批处理文件执行如下操作:
@echo off
echo Start at: %cd%
cd sub
cd sub2
echo Currently at: %cd%
第二个echo
命令肯定会显示C:\some\dir\sub\sub2
。但是,如果将%cd%
放在代码块中的 ,即括在括号中(如if
或for
命令内),那么这是经典的延迟扩展问题(如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!
)
有关详细信息,请查看“延迟扩展”。
答案 1 :(得分:1)
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 .
然而不会失败...