92

我有一个位于目录中的批处理文件,也必须从那里运行,因为它更新了该目录中的文件。
这工作得很好,除非用户以管理员身份运行批处理文件(Vista 需要)。那么起始目录是C:\Windows\System32。

有没有办法仍然能够知道批处理文件是从哪个目录运行的?
我不希望用户手动输入目录。

4

8 回答 8

122

尝试像这样访问批处理文件路径:

echo %~dp0

for /?有关更多信息,请参阅描述上述命令如何工作的命令中的以下引用:

您现在可以使用以下可选语法:

    %~I - 扩展 %I 删除任何周围的引号 (")
    %~fI - 将 %I 扩展为完全限定的路径名
    %~dI - 仅将 %I 扩展为驱动器号
    %~pI - 仅将 %I 扩展为路径
    %~nI - 仅将 %I 扩展为文件名
    %~xI - 仅将 %I 扩展为文件扩展名
    %~sI - 扩展路径仅包含短名称
    %~aI - 将 %I 扩展为文件的文件属性
    %~tI - 将 %I 扩展到文件的日期/时间
    %~zI - 将 %I 扩展为文件大小
    %~$PATH:I - 搜索 PATH 中列出的目录
                   环境变量并将 %I 扩展到
                   找到的第一个名称的完全限定名称。
                   如果环境变量名不是
                   已定义或文件未找到
                   搜索,然后这个修饰符扩展为
                   空字符串

可以组合修饰符以获得复合结果:

    %~dpI - 仅将 %I 扩展为驱动器号和路径
    %~nxI - 仅将 %I 扩展为文件名和扩展名
    %~fsI - 将 %I 扩展为仅包含短名称的完整路径名
    %~dp$PATH:I - 搜索 PATH 中列出的目录
                   %I 的环境变量并扩展为
                   找到的第一个驱动器号和路径。
    %~ftzaI - 将 %I 扩展为类似 DIR 的输出线
于 2009-03-23T09:42:36.027 回答
58

cd哪个pushd更好

  • 如果从开始更改驱动器号D:\...
  • 如果在 UNC 网络路径上,则分配驱动器号

所以pushd %~dp0很好。

好的做法是在完成后打电话popd

于 2011-02-08T12:59:44.403 回答
36

这应该通过将批处理文件的工作目录设置回当前目录来解决您的问题:

在 .bat 脚本的顶部包含这两行:

@setlocal enableextensions
@cd /d "%~dp0"

位于:http: //www.codeproject.com/Tips/119828/Running-a-bat-file-as-administrator-Correcting-cur

于 2015-05-15T10:13:22.510 回答
3

要解决此问题,请在 .bat 脚本的顶部包含以下两行:

@setlocal enableextensions
@cd /d "%~dp0"
于 2020-06-22T11:39:20.910 回答
1

我用:

光盘 %0..

在批处理文件的开头将目录更改为启动批处理文件的目录。

-马修

于 2009-06-01T18:55:33.427 回答
1

@setlocal 启用扩展

@cd /d "%~dp0"

于 2020-02-01T07:02:31.310 回答
0

您可以通过添加父文件名直接从文件名 CD(未在 Windows 8.x 中测试,但据我所知,“永远”工作)。

CD %FILENAME%\..

并且 CD 也将使用 /D 更改驱动器,如上所示,但未明确提及,因此可能会被遗漏。CD /D %FILENAME%\..

(如果您使用 cmd.exe,FOR /?IF /?SET /?CALL /?GOTO /? 都提供非常有用的阅读,我会不时重读它们。)

于 2015-11-20T18:46:25.567 回答
-1

这里的工作解决方案:

http://www.vistax64.com/vista-general/79849-run-administrator-changes-default-directory.html

FOR /F %%I IN ("%0") DO SET BATDIR=%%~dpI

ECHO 批处理文件位于目录 %BATDIR%

于 2010-10-25T12:29:59.090 回答