获取当前的批处理文件目录


283

首先,我看到了这个话题,但我听不懂。

题 :

D:\path\to\file.bat包含以下内容的批处理文件:

echo %cd%
pause

输出为:

C:\

一定是 D:\path\to

我究竟做错了什么?


7
您应该阅读问题的所有答案,尤其是获得更高投票者的答案,而不仅仅是已接受的答案。您发布的链接中得分最高的答案已经回答了您的问题。
dbenham

4
如果您在c:\中,则在键入批处理文件名时,%cd%将打印c:\。
foxidrive 2013年

Answers:


496

系统只读变量%CD%保留批处理调用方的路径,而不保留批处理文件的位置。

您可以使用%0(例如scripts\mybatch.bat)获得用户键入的批处理脚本本身的名称。可以将参数扩展名应用于此,因此%~dp0会将驱动器和路径返回到批处理脚本(例如W:\scripts\),%~f0并返回完整的路径名(例如W:\scripts\mybatch.cmd)。

您可以使用以下语法在与批处理脚本相同的文件夹中引用其他文件:

CALL %0\..\SecondBatch.cmd

这甚至可以在子例程中使用,Echo %0将提供调用标签,但是echo "%~nx0"将提供批处理脚本的文件名。

%0变量被扩展,结果是包含在引号。

更多关于批处理参数


1
看,我不需要stm.sql参加D:\Dir1\Dir2\stm.sql。我需要 mysql.exe -u root -p mysql < %cd%\stm.sql执行该stm.sql命令。
Hamed Kamrava 2013年

@HamedKamrava是我的SQL批处理吗?不是批处理文件像*.bat*.sh
Stoleg

@ Stoleg-事实上,有2个文件中D:\Dir1\Dir2\batchfile.batD:\Dir1\Dir2\stm.sql。batchfile.bat的内容是:mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql和stm.sql的内容是一些MySQL命令。
Hamed Kamrava 2013年

1
系统只读变量%CD%保留批处理调用方的路径,而不保留批处理文件的位置。
Stoleg

34
echo %~dp0将路径返回到批次位置。echo %~f0将返回带有文件名的批处理路径。
Stoleg 2013年

119

很简单:

setlocal
cd /d %~dp0
File.exe

9
代码很短,但不容易理解。这是什么File.exe?当前目录路径是否存储在%〜dp0中?
伊瓦洛·巴尔达罗夫

我认为,这个答案实际上回答了这个问题。荣誉
macetw

3
我只是用作cd /d %~dp0批处理文件的第一行
而已

为什么需要setlocal?没有它也能很好地返回?
T.Todua

1
@ T.Todua“ setlocal”导致任何环境更改,包括当前目录,直到批处理文件结束或遇到“ endlocal”为止。如果要更改环境变量或当前目录,这是一种很好的形式。
杰米

30

在您的.bat文件中:

set mypath=%cd%

现在,您可以使用变量%mypath%来引用文件的文件路径.bat。要验证路径是否正确:

@echo %mypath%

例如,一个DIR.bat具有以下内容的文件

set mypath=%cd%
@echo %mypath%
Pause

从目录运行g:\test\bat将在DOS命令窗口中回显该路径。


1
这是最好,最简单的解决方案
Nani

7
这不是一个好的解决方案,因为它没有考虑从另一个路径上的另一个文件调用的批处理脚本。
theQuestionMan

同样,以提升的权限运行时,%cd%返回C:\ Windows \ system32,但不返回其存储目录。
PravyNandas

9

这是我在所有批处理文件顶部使用的内容。我只是从模板文件夹中复制/粘贴。

@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"

将当前批处理文件的路径设置为%batdir%可以使您在当前批处理文件的后续stmts中调用它,而不管此批处理文件更改到何处。使用PUSHD,您可以使用POPD快速将该批处理文件的路径设置为原始%batdir%。请记住,如果使用%batdir%ExtraDir或%batdir%\ ExtraDir(取决于上面使用的版本,是否使用反斜杠),如果路径中有空格(例如,“%batdir%ExtraDir”,则需要用双引号将整个字符串引起来) )。您可以始终使用PUSHD%〜dp0。[https://ss64.com/nt/syntax-args.html]具有更多(%〜)参数。

请注意,在行首使用(::)使其成为注释行。更重要的是,使用::允许您在该注释中包括重定向器,管道,特殊字符(即<> |等)。

:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt

当然,Powershell可以完成更多工作。


2
很好的答案,非常感谢!:-) 请当心您的第二种技巧(set batdir=%CD%)。这不行,因为它是调用方的路径,而不是bat文件本身。获取执行bat文件路径的唯一有效方法是%~dp0
米奇·麦克马伯斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.