我有一个批处理文件,它在一个目录中,必须在该目录中运行,因为它会更新该目录中的文件。
这个批处理文件在普通用户权限下可以正常工作,但是如果用户使用管理员权限来运行它(Vista 系统需要管理员权限),那么起始目录将变成 C:\Windows\System32。
有没有办法仍然能够知道批处理文件是从哪个目录运行的?
我不想让用户手动输入目录。
我有一个批处理文件,它在一个目录中,必须在该目录中运行,因为它会更新该目录中的文件。
这个批处理文件在普通用户权限下可以正常工作,但是如果用户使用管理员权限来运行它(Vista 系统需要管理员权限),那么起始目录将变成 C:\Windows\System32。
有没有办法仍然能够知道批处理文件是从哪个目录运行的?
我不想让用户手动输入目录。
尝试以以下方式访问批处理文件的路径:
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输出行的形式
pushd
- nwgat比起 cd
命令,pushd
命令更好用,它可以:
D:\...
开头的路径下改变磁盘驱动器字母。因此,pushd %~dp0
是个不错的选择。
好的实践是,完成操作后调用 popd
命令。
popd
(需要使用 &
) - Andry通过将批处理文件的工作目录设置回当前目录,这应该可以解决您的问题:
在您的 .bat 脚本顶部包含以下两行:
@setlocal enableextensions
@cd /d "%~dp0"
发现于:http://www.codeproject.com/Tips/119828/Running-a-bat-file-as-administrator-Correcting-cur
@setlocal enableextensions
@cd /d "%~dp0"
cd %0..
在批处理文件的开头,将目录更改为启动批处理文件的目录。cd %0/../
。 - St3ve R0nix@setlocal enableextensions
@cd /d "%~dp0"
你可以通过添加父级文件名(在Windows 8.x中未经测试,但据我所知一直有效)直接从文件名CD。
CD %FILENAME%\..
使用 /D,CD 命令也会更改驱动器,如上所示,但未明确提及,因此可能会被忽略。 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
。 - Joey
rundll32
调用的可执行文件和DLL。例如,可以在 https://dev59.com/PGMl5IYBdhLWcg3wBzDy 中看到它适用于cmd
。 - JdeBP