ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

M
Martin

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

echo %~dp0

有关详细信息,请参阅命令 for /? 中的以下引用,该引用描述了上述命令的工作方式:

You can now use the following optional syntax:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~dI        - expands %I to a drive letter only
    %~pI        - expands %I to a path only
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    %~sI        - expanded path contains short names only
    %~aI        - expands %I to file attributes of file
    %~tI        - expands %I to date/time of file
    %~zI        - expands %I to size of file
    %~$PATH:I   - searches the directories listed in the PATH
                   environment variable and expands %I to the
                   fully qualified name of the first one found.
                   If the environment variable name is not
                   defined or the file is not found by the
                   search, then this modifier expands to the
                   empty string

The modifiers can be combined to get compound results:

    %~dpI       - expands %I to a drive letter and path only
    %~nxI       - expands %I to a file name and extension only
    %~fsI       - expands %I to a full path name with short names only
    %~dp$PATH:I - searches the directories listed in the PATH
                   environment variable for %I and expands to the
                   drive letter and path of the first one found.
    %~ftzaI     - expands %I to a DIR like output line

太棒了,我不知道这个。非常感谢
多么晦涩难懂!但正是我需要的。谢谢。
@stucampbell 尝试命令“for /?”获取有关其工作原理的详细说明(向下滚动到第 4 页)
Donny V 试试下面的 pushd
@Donny V 它确实适用于 Windows 8.1 - 我试过了。请记住,这仅在您在批处理文件中运行时才有效。
B
Benoit

cd 更好的是 pushd,它将

如果从 D:\... 开始,请更改驱动器号

如果在 UNC 网络路径上,则分配驱动器号

所以 pushd %~dp0 很好。

好的做法是在完成后调用 popd


适用于具有多个卷的系统的绝佳解决方案,适用于 Windows 7、8、8.1 和 10,+1
C
Community

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

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

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

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


太棒了。解决了以管理员身份运行 bat 文件时的“找不到文件”问题。
M
Majid Azarniush

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

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

M
Mathew

我用:

光盘 %0..

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

-马修


这不会改变驱动器号。
这实际上是最好的解决方案,只需将其更改为 cd %0/../ 👍
S
Syed Abdul Haseeb

@setlocal 启用扩展

@cd /d "%~dp0"


M
Malcolm

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

CD %FILENAME%\..

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

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


d
domotor

这里的工作解决方案:

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