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

时间:2015-04-30 09:15:12

标签: windows batch-file cmd command-line-interface working-directory

当我运行位于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作为输出。

修改

here

2 个答案:

答案 0 :(得分:3)

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

@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!
)

有关详细信息,请查看“延迟扩展”。

答案 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 .然而不会失败...

more info