以管理员身份运行U盘VBScript时正确获取U盘盘符的方案
问题现象
- 存储在U盘中的VBS脚本,普通权限运行可正常调用同目录下
Scripts文件夹内的两个批处理文件;右键选择「以管理员身份运行」时,直接弹出“系统找不到指定的文件”错误。 - 调试结果验证:普通权限运行时脚本工作目录为U盘盘符(示例为F:),管理员权限运行时工作目录默认变为系统盘C:,导致相对路径
Scripts\Rec.bat被解析为C:\Scripts\Rec.bat,和U盘中实际文件路径不匹配触发报错。 - 约束条件:
Rec.bat内的逻辑必须依赖管理员权限才能正常执行,无法通过普通权限运行脚本的方式绕过问题。
故障原因
Windows系统在启动管理员权限进程时,会默认将进程的工作目录设置为系统目录C:\Windows\System32,不会继承脚本所在的U盘路径,原代码使用相对路径寻址,必然会出现路径偏移。
修复方案
放弃依赖工作目录的相对路径写法,直接通过VBS内置属性获取脚本自身所在的绝对路径,再拼接批处理文件的完整路径调用,不受启动权限、工作目录切换的影响,修复后代码如下:
Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("Wscript.Shell") ' 获取当前VBS脚本所在的文件夹绝对路径,不受工作目录影响 strScriptFolder = objFSO.GetParentFolderName(WScript.ScriptFullName) ' 拼接两个批处理文件的完整路径 strRecBat = objFSO.BuildPath(strScriptFolder, "Scripts\Rec.bat") strProdBat = objFSO.BuildPath(strScriptFolder, "Scripts\Prod.bat") ' 隐藏窗口执行目标批处理 objShell.Run """" & strRecBat & """", 0 objShell.Run """" & strProdBat & """", 0 Set objShell = Nothing Set objFSO = Nothing
关键逻辑说明:
WScript.ScriptFullName属性会返回当前运行脚本的完整磁盘路径,和启动权限、工作目录无关,无论脚本在U盘还是本地磁盘,无论是否提权运行,都能准确定位脚本所在位置,从根源避免路径解析错误。
内容的提问来源于stack exchange,提问作者Tathastu Pandya
相关产品推荐
相关产品推荐

