【问题标题】:Batch file get present working directory after cd commandcd 命令后批处理文件获取当前工作目录
【发布时间】:2015-04-30 09:15:12
【问题描述】:

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

但是在批处理文件执行了几个cd 命令之后,我还没有设法获得“当前工作目录”。

例如:

  • 批处理文件在C:\some\dir
  • 批处理文件执行cd sub 和更高版本cd sub2

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

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

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

编辑

link to a short version of my batch file

【问题讨论】:

  • 它的工作方式与您描述的完全一样,在这里...
  • 请阅读here。在没有看到您的代码的情况下(如果您将其包含在问题中会更容易),似乎有两种选择:1)延迟扩展的问题或 2)直接分配给 %cd% 变量的值掩盖了该值。

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


【解决方案1】:

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

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

更多详情,请查看“延迟扩展”。

【讨论】:

  • 我已经编辑了我的原始问题并添加了一个指向我的批处理文件的链接。关于代码块/延迟扩展,您是对的! setlocal EnableDelayedExpansion 并使用 !cd! 命令修复它。谢谢!
【解决方案2】:

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

【讨论】:

  • 关于 I) 我不想返回到原始目录。我正在尝试在 cd 命令 之后获取当前目录。将尝试 II) 并报告。
  • 虽然pushdpopd 在我的情况下看起来很有用。
猜你喜欢
  • 2021-12-02
  • 2013-06-08
  • 2016-12-05
  • 2012-05-18
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2012-03-24
相关资源
最近更新 更多