批处理文件在 cd 命令后获取当前工作目录
Batch file get present working directory after cd command
当我 运行 位于 C:\some\dir
中的批处理文件时,我知道我可以使用 %cd%
和 %~dp0
来获取批处理文件本身和其他文件的路径描述的信息 here.
但是在批处理文件执行了几个 cd
命令后,我还没有设法获得 "present working directory"。
例如:
- 批处理文件在
C:\some\dir
- 批处理文件执行
cd sub
之后 cd sub2
我如何获得那个文件夹的路径?
它应该产生 C:\some\dir\sub\sub2
并且在命令行中手动执行上述所有操作时相当于 pwd
命令!
上面的任何命令我都不走运!它说 here %cd%
变量应该在使用 cd
命令后更新,但我总是得到 C:\some\dir
作为输出。
编辑
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 .
但是永远不会失败...
如果您的批处理文件执行如下操作:
@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!
)
有关更多详细信息,请查找 "delayed expansion"。
当我 运行 位于 C:\some\dir
中的批处理文件时,我知道我可以使用 %cd%
和 %~dp0
来获取批处理文件本身和其他文件的路径描述的信息 here.
但是在批处理文件执行了几个 cd
命令后,我还没有设法获得 "present working directory"。
例如:
- 批处理文件在
C:\some\dir
- 批处理文件执行
cd sub
之后cd sub2
我如何获得那个文件夹的路径?
它应该产生 C:\some\dir\sub\sub2
并且在命令行中手动执行上述所有操作时相当于 pwd
命令!
上面的任何命令我都不走运!它说 here %cd%
变量应该在使用 cd
命令后更新,但我总是得到 C:\some\dir
作为输出。
编辑
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 .
但是永远不会失败...
如果您的批处理文件执行如下操作:
@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!
)
有关更多详细信息,请查找 "delayed expansion"。