获取当前批处理文件目录

首先,我看到这个话题,但我不能理解。

问题:

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

echo %cd%
pause

输出为:

C:\

它必须是D:\path\to

我做错了什么?

561527 次浏览

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

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

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

CALL %0\..\SecondBatch.cmd

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

当展开%0变量时,结果被括在引号中。

关于批处理参数的更多信息

非常简单:

setlocal
cd /d %~dp0
File.exe

在你的。bat文件中:

set mypath=%cd%

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

@echo %mypath%

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

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

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

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

@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可以做到这一点,还有很多其他功能。