我有一个位于目录中的批处理文件,也必须从那里运行,因为它更新了该目录中的文件。这工作得很好,除非用户以管理员身份运行批处理文件(Vista 需要)。那么起始目录是C:\Windows\System32。有没有办法仍然能够知道批处理文件是从哪个目录运行的?我不希望用户手动输入目录。
rundll32
调用的可执行文件和 DLL。例如,参见它在 stackoverflow.com/q/18756671/340790 处应用于 cmd
。
尝试像这样访问批处理文件路径:
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
比 cd
更好的是 pushd
,它将
如果从 D:\... 开始,请更改驱动器号
如果在 UNC 网络路径上,则分配驱动器号
所以 pushd %~dp0
很好。
好的做法是在完成后调用 popd
。
这应该通过将批处理文件的工作目录设置回当前目录来解决您的问题:
在 .bat 脚本的顶部包含这两行:
@setlocal enableextensions
@cd /d "%~dp0"
发现于:http://www.codeproject.com/Tips/119828/Running-a-bat-file-as-administrator-Correcting-cur
要解决此问题,请在 .bat 脚本的顶部包含以下两行:
@setlocal enableextensions
@cd /d "%~dp0"
我用:
光盘 %0..
在批处理文件的开头将目录更改为启动批处理文件的目录。
-马修
cd %0/../
👍
@setlocal 启用扩展
@cd /d "%~dp0"
您可以通过添加父文件名直接从文件名 CD(未在 Windows 8.x 中测试,但据我所知,“永远”工作)。
CD %FILENAME%\..
并且 CD 也将使用 /D 更改驱动器,如上所示,但未明确提及,因此可能会被遗漏。 CD /D %FILENAME%\..
(如果您使用 cmd.exe,FOR /?IF /?SET /?CALL /?GOTO /? 都提供非常有用的阅读,我会不时重读它们。)
这里的工作解决方案:
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
。
pushd