如何在批处理中获取另一个驱动器的当前工作目录?

wol*_*evo 4 windows cmd batch-file

有没有办法获取当前驱动器以外的驱动器的当前工作目录?

Windows 存储每个驱动器的当前目录并%cd%获取实际驱动器的当前工作目录。

如果我在批处理脚本中更改驱动器,我可以获得实际驱动器的当前工作目录:

cd w:\Downloads
cd c:\Windows
c:
(echo %cd%)
w:
(echo %cd%)
Run Code Online (Sandbox Code Playgroud)

有没有办法在不更改实际驱动器的情况下获取当前工作目录?

wol*_*evo 6

搜索答案后,我在https://blogs.msdn.microsoft.com/oldnewthing/20100506-00/?p=14133下发现了一些关于奇怪变量的提示

用于%=c:%)驱动器 c 的当前目录或%=w:%)w

或者在批处理脚本中:

cd c:\Windows
cd w:\Downloads
(echo %=c:%)
(echo %=w:%)
Run Code Online (Sandbox Code Playgroud)

更新

正如 @RossRidge 指出的那样,存储这些奇怪变量的不是 Windows ,而是 DOS 命令处理器。这些奇怪的变量只有在当前的“会话”中才知道。这同样适用cd(参见@Stephan 的评论)

打开两个 DOS 命令处理器:

在第一个 DOS 命令处理器中:

cd c:\Windows
cd w:\Downloads
(echo %=c:%)
    -> c:\Windows
(echo %=w:%)
    -> w:\Downloads
cd w:
    -> w:\Downloads
Run Code Online (Sandbox Code Playgroud)

在第二个 DOS 命令处理器中:

(echo %=w:%)
    -> %=w:%       <- this variable is not set, not known
cd w:
    -> w:\
Run Code Online (Sandbox Code Playgroud)

请注意保存“当前目录”的不一致方式:cd进入 DOS 命令处理器后返回根目录。但%=w:%直到目录更改后才设置!

  • 您还会注意到,Windows 实际上并不存储每个驱动器的当前目录:“Win32 没有每个驱动器的单独当前目录的概念,但命令处理器希望保留旧的 MS-DOS 行为,因为人们已经习惯了(并且批处理文件依赖于它)。解决方案是将这个“每个驱动器当前目录”存储在环境中,使用奇怪的 -o 环境变量名称,这样它就不会与正常环境变量冲突。 (6认同)