以管理员身份运行时 Windows 批处理文件的起始目录

101

我有一个批处理文件,它在一个目录中,必须在该目录中运行,因为它会更新该目录中的文件。
这个批处理文件在普通用户权限下可以正常工作,但是如果用户使用管理员权限来运行它(Vista 系统需要管理员权限),那么起始目录将变成 C:\Windows\System32。

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


https://stackoverflow.com/q/47234901/340790 指出了这里的一般问题,即有很多答案都说要修改命令脚本,但没有一个答案解释如何使实际快捷方式正常工作并具有初始工作目录,该目录实际上是快捷方式所指定的。值得注意的是,快捷方式中的此工作目录问题适用于不止脚本。它也适用于通过rundll32调用的可执行文件和DLL。例如,可以在 https://dev59.com/PGMl5IYBdhLWcg3wBzDy 中看到它适用于 cmd - JdeBP
8个回答

133

尝试以以下方式访问批处理文件的路径:

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输出行的形式

好神秘啊!但正是我需要的。谢谢。 - stucampbell
1
@stucampbell 请尝试使用命令 'for /?' 来获取关于此命令如何工作的详细描述(向下滚动至第4页)。 - Martin
Donny V 尝试在下面使用 pushd - nwgat
@Donny V,它在Windows 8.1上可以运行 - 我试过了。请记住,只有在批处理文件内运行时才能起作用。 - Martin
仍然适用于Win10。 - Bill O

63

比起 cd 命令,pushd 命令更好用,它可以:

  • 在以 D:\... 开头的路径下改变磁盘驱动器字母。
  • 在 UNC 网络路径下指定一个磁盘驱动器字母。

因此,pushd %~dp0 是个不错的选择。

好的实践是,完成操作后调用 popd 命令。


适用于多卷系统的绝佳解决方案,可在Windows 7、8、8.1和10中运行,+1。 - Bit Fracture
pushd "..." && ( ... & popd ) 用单行代码连接 popd(需要使用 & - Andry

49

3
非常完美。当我以管理员身份运行批处理文件时,解决了我的“找不到文件”的问题。 - Aloha

5
为了解决这个问题,请在您的 .bat 脚本顶部添加以下两行代码:
@setlocal enableextensions
@cd /d "%~dp0"

1
我使用以下命令:

cd %0..

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

2
那不会改变驱动器字母。 - Jorge Fuentes González
这实际上是最好的解决方案,只需将其更改为cd %0/../ - St3ve R0nix

1

@setlocal enableextensions

@cd /d "%~dp0"


0

你可以通过添加父级文件名(在Windows 8.x中未经测试,但据我所知一直有效)直接从文件名CD。

CD %FILENAME%\..

使用 /D,CD 命令也会更改驱动器,如上所示,但未明确提及,因此可能会被忽略。 CD /D %FILENAME%\..

(对于使用 cmd.exe 的用户来说,FOR /?、IF /?、SET /?、CALL /?、GOTO /? 都提供了非常有用的阅读材料,我偶尔会重新阅读它们。)


-1

4
您可以直接使用 %~dp0,这里不需要调用 for - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接