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

Posted

技术标签:

【中文标题】“以管理员身份运行”时的 Windows 批处理文件起始目录【英文标题】:Windows batch file starting directory when 'run as admin' 【发布时间】:2010-10-14 22:25:42 【问题描述】:

我有一个批处理文件,它位于一个目录中,也必须从那里运行,因为它会更新此目录中的文件。 这工作得很好,除非用户以管理员身份运行批处理文件(Vista 需要)。那么起始目录是 C:\Windows\System32。 有没有办法仍然能够知道批处理文件是从哪个目录运行的? 我不希望用户手动进入目录。

【问题讨论】:

***.com/q/47234901/340790 指出了这里的一般问题,有很多答案都说要修改命令脚本,而 no 答案解释了如何获得实际的快捷方式正常工作并拥有快捷方式实际显示的初始工作目录。值得注意的是,快捷方式中的这个工作目录问题不仅仅适用于脚本。它也适用于通过rundll32 调用的可执行文件和DLL。例如,在***.com/q/18756671/340790 看到它适用于cmd 【参考方案1】:

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

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 试试命令'for /?'详细了解其工作原理(向下滚动至第 4 页) Donny V 试试下面的pushd @Donny V 它确实适用于 Windows 8.1 - 我试过了。请记住,这仅在您在批处理文件中运行时才有效。【参考方案2】:

cd 更好的是pushd,它将

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

所以pushd %~dp0 很好。

好的做法是在完成后致电popd

【讨论】:

适用于多卷系统的出色解决方案,适用于 Windows 7、8、8.1 和 10,+1【参考方案3】:

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

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

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

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

【讨论】:

这是完美的。解决了我以管理员身份运行 bat 文件时的“找不到文件”问题。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

我用:

cd %0..

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

-马修

【讨论】:

这不会改变驱动器号。 这其实是最好的解决方案,直接改成cd %0/../?【参考方案6】:

@setlocal 启用扩展

@cd /d "%~dp0"

【讨论】:

【参考方案7】:

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

CD %FILENAME%\..

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

(对于 /? 如果 /? 放 /? 称呼 /? 去 /? 如果您使用 cmd.exe,所有这些都提供了非常有用的阅读,我会不时重读它们。)

【讨论】:

【参考方案8】:

这里有一个可行的解决方案:

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

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

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

【讨论】:

您可以直接使用%~dp0。此处无需调用for

以上是关于“以管理员身份运行”时的 Windows 批处理文件起始目录的主要内容,如果未能解决你的问题,请参考以下文章

怎样自动以管理员身份运行bat文件

怎样自动以管理员身份运行bat文件

如何以管理员身份运行powershell

如何在 Windows XP 上以管理员身份运行另一个应用程序

如何让windows7默认为以管理员身份打开所有程序

在Windows 7下调试需要管理员权限的程序