获取当前批处理文件目录

时间:2013-06-12 11:09:22

标签: windows batch-file working-directory

首先,我看到this topic,但我无法理解。

问题:

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

echo %cd%
pause

输出是:

C:\

必须是D:\path\to

我做错了什么?

4 个答案:

答案 0 :(得分:438)

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

您可以使用%0(例如scripts\mybatch.bat)来获取用户输入的批处理脚本本身的名称。 Parameter extensions可以应用于此,因此%~dp0将返回批处理脚本的驱动器和路径(例如W:\scripts\),%~f0将返回完整路径名(例如{{1} }})。

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

W:\scripts\mybatch.cmd

这甚至可以在子例程中使用,CALL %0\..\SecondBatch.cmd 将给出调用标签,但Echo %0将为您提供批处理脚本的文件名。

展开echo "%~nx0"变量时,结果用引号括起来。

More on batch parameters

答案 1 :(得分:105)

很简单:

setlocal
cd /d %~dp0
File.exe

答案 2 :(得分:23)

在.bat文件中:

set mypath=%cd%

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

@echo %mypath%

例如,名为DIR.bat的文件包含以下内容

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

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

答案 3 :(得分:1)

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

@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可以做到这一点,而且还有更多。