获取当前批处理文件目录

Ham*_*ava 254 windows batch-file working-directory

首先,我看到了这个话题,但我无法理解.

题 :

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

echo %cd%
pause
Run Code Online (Sandbox Code Playgroud)

输出是:

C:\
Run Code Online (Sandbox Code Playgroud)

肯定是 D:\path\to

我究竟做错了什么?

Sto*_*leg 461

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

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

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

CALL %0\..\SecondBatch.cmd
Run Code Online (Sandbox Code Playgroud)

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

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

更多关于批处理参数.

  • `echo%~dp0`将返回批处理位置的路径.`echo%~f0`将返回带文件名的批处理的路径. (31认同)

sha*_*hay 109

非常简单:

setlocal
cd /d %~dp0
File.exe
Run Code Online (Sandbox Code Playgroud)

  • 代码很短,但理解起来并不简单.这个File.exe是什么?当前目录路径是否存储在%~dp0中? (8认同)
  • 我只是使用 `cd /d %~dp0` 作为批处理文件的第一行并工作 (4认同)
  • @T.Todua“setlocal”会导致任何环境更改,包括包含当前目录,直到批处理文件结束或遇到“endlocal”。如果您要更改环境变量或当前目录,这是一种很好的形式。 (3认同)
  • @IvailoBardarov以下是答案:/sf/answers/1281709901/ (2认同)
  • 最好使用 `"%~dp0"` 而不是 `%~dp0`。引号将保证路径被视为一个标记,即使有空格,并且还可以防止像“&”这样的有毒字符。 (2认同)

小智 28

在.bat文件中:

set mypath=%cd%
Run Code Online (Sandbox Code Playgroud)

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

@echo %mypath%
Run Code Online (Sandbox Code Playgroud)

例如,DIR.bat使用以下内容调用的文件

set mypath=%cd%
@echo %mypath%
Pause
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是一个好的解决方案,因为它没有考虑从另一个路径上的另一个文件调用批处理脚本. (5认同)
  • 另外,您可以只使用“%cd%”。无需先复制它。 (2认同)

小智 14

Here's what I use at the top of all my batch files. I just copy/paste from my template folder.

@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"
Run Code Online (Sandbox Code Playgroud)

Setting current batch file's path to %batdir% allows you to call it in subsequent stmts in current batch file, regardless of where this batch file changes to. Using PUSHD allows you to use POPD to quickly set this batch file's path to original %batdir%. Remember, if using %batdir%ExtraDir or %batdir%\ExtraDir (depending on which version used above, ending backslash or not) you will need to enclose the entire string in double quotes if path has spaces (i.e. "%batdir%ExtraDir"). You can always use PUSHD %~dp0. [https: // ss64.com/ nt/ syntax-args .html] has more on (%~) parameters.

Note that using (::) at beginning of a line makes it a comment line. More importantly, using :: allows you to include redirectors, pipes, special chars (i.e. < > | etc) in that comment.

:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt
Run Code Online (Sandbox Code Playgroud)

Of course, Powershell does this and lots more.

  • 很好的答案,非常感谢!:-) **请注意你的第二种技术(`set batdir=%CD%`)。** 这是不行的,因为它是调用者的路径,而不是 bat 文件本身。获取正在执行的bat文件的路径的唯一有效方法是“%~dp0”。 (3认同)