批处理文件中的当前目录是什么?

642

我想创建几个批处理文件来自动化一个程序。

我的问题是,当我创建批处理文件时,当前目录是什么? 它是文件所在的目录还是出现在命令提示符中的相同目录,或者是其他目录?

9个回答

1253

88
实际上,它看起来像是%dp0给出了执行批处理文件所在的目录的完整路径。%dpnx0(等同于%~f0)则给出了批处理文件的完整路径。有关更多详细信息,请参见http://www.robvanderwoude.com/parameters.php。 - deadlydog
6
请参见类似问题的好的详细答案:获取Windows批处理脚本(.bat)中传递参数的列表 - oHo
3
很不幸,当从.NET进程中运行时,%~dp0表示的是当前工作目录而不是批处理文件所在的目录。我通过艰难的方式发现了这一点。 - trampster
4
更明确的例子是,当右键点击一个 .cmd 文件并以管理员身份运行时,%cd% 返回 C:\WINDOWS\system32,而 %~dp0 返回批处理文件所在的目录,末尾带有斜杠。 - icc97
1
@TwistedCode %~dp0 引用批处理文件参数的驱动器和路径。它__不是__一个环境变量引用,而是一个__批处理文件参数__引用。%~dp0 展开为__当前处理的__批处理文件的完整路径。例如,批处理文件 C:\Temp\Devlopement & Test()!\Main.bat 在执行时 %~dp0 展开为 C:\Temp\Devlopement & Test()!\,可以使用 call "%~dp0..\SubBatch.cmd" 调用批处理文件 C:\Temp\SubBatch.cmd,其中也包含 %~dp0 在执行时展开为 C:\Temp\。在 cmd 窗口中运行 call /? 获取帮助。 - Mofi
显示剩余3条评论

29

通常情况下,该批处理文件所在的目录是启动它的目录,但如果您从快捷方式启动批处理文件,则可能会给出不同的起始目录。此外,当您在cmd中时,当前目录为c:\dir3,您仍然可以使用c:\dir1\dir2\batch.bat 启动批处理文件,在这种情况下,当前目录将为c:\dir3


15
在批处理文件中,%cd%是最常用的表示当前目录的命令,尽管你可以设置自己的变量:
set mypath=%cd%
echo %mypath% (where %mypath% is the current directory that the batch file is sitting in)

假设你想打开Myprog.exe。如果它在同一个文件夹中,你可以使用以下命令:

start %mypath%\Myprog.exe

这将从当前文件夹打开Myprog。

另一种选择是在C:中创建一个名为AutomatePrograms的目录。然后,您将文件传输到该文件夹,然后可以使用以下命令打开它们:

start "" "C:\AutomatePrograms\Myprog1.exe"
start "" "C:\AutomatePrograms\Myprog2.exe"
start "" "C:\AutomatePrograms\Myprog3.exe"

2
正如此处的最佳答案所述,%cd%是一个变量,因此以管理员身份从Windows资源管理器运行批处理文件将会得到C:\WINDOWS\system32,这几乎肯定不是您想要的。%~dp0更加一致。 - icc97

13

%__CD__%%CD%%=C:%%~dp0

还有另一个动态变量%__CD__% 指向当前目录,但与%CD%不同,它在末尾有一个反斜杠。如果您想将文件附加到当前目录,则此功能很有用。此外,%CD%在禁用扩展环境下无法工作,但%__CD__%始终有效。

使用%=C:% %=D:%,可以访问相应驱动器的上次访问的目录。如果未定义变量,则表示您没有在当前cmd会话中访问该驱动器。

%__APPDIR__%扩展为运行当前脚本即cmd.exe目录的可执行文件。

使用%~dp0参数,您可以获取脚本本身所在的目录(除非使用了shift命令)


8

假设您想要在当前目录下打开一个文件,命令应该是:

 start %cd%\filename.filetype

我希望我已经回答了你的问题。

在通过 .bat 文件调用时,这很容易解析为 C:\Windows\filename.filepath,而不是使用批处理文件所在的位置。 在这种情况下,%cd% 解析为 CMD 的位置,而不是该文件的位置。 - Koenigsberg

5

这是执行批处理文件的命令所在的目录。

如上述答案中提到的,您可以在脚本中添加以下命令进行验证:

> set current_dir=%cd%
> echo %current_dir%  

4

这是批处理文件启动时的目录。例如,如果您的批处理文件位于c:\dir1\dir2中,并且您执行了cd c:\dir3,然后运行该批处理文件,则当前目录将为c:\dir3


1

以下是我的个人观点。
如果从放在U盘上的批处理文件(Windows 7)中调用以下命令,则会失败:

%SystemRoot%\System32\xcopy.exe /e /i "%cd%Ala" "C:\KS\Ala\"

但这可以完成工作:
%SystemRoot%\System32\xcopy.exe /e /i "%~dp0Ala" "C:\KS\Ala\"

这是我一直在寻找的开关,用于确定批处理文件的父目录路径,而不包括该批处理文件的名称:%~dp0 - Ammar Mohammad

0
您的批处理文件应该在打开它时所在的目录中。但是,如果您想将其放入其他目录中,可以使用cd [其他目录]命令进行操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接