如何在批处理脚本中获取调用自身的快捷方式所在目录
获取调用批处理脚本的快捷方式所在目录
这个需求确实有点棘手——批处理自带的%~dp0只会返回脚本本身的路径,完全获取不到调用它的快捷方式的位置。不过我们可以借助WMI或者PowerShell的能力,直接在原脚本里实现这个功能,不用额外写中间脚本。下面给你两种可行的方案:
方案一:借助WMI查询进程关联的快捷方式
这个思路是先找到当前脚本进程的PID,再通过WMI找到触发该进程的快捷方式,最后提取快捷方式的所在目录:
@echo off setlocal enabledelayedexpansion :: 获取当前脚本的完整路径,用于匹配进程 set "script_fullpath=%~dpnx0" :: 从任务列表中筛选出当前脚本对应的cmd进程PID for /f "tokens=2 delims=," %%a in ('tasklist /v /fo csv /fi "imagename eq cmd.exe" ^| findstr /i "%script_fullpath%"') do ( set "curr_pid=%%~a" ) :: 通过WMI获取该进程的命令行,再反向查找对应的快捷方式 for /f "tokens=2 delims==" %%a in ('wmic process where "ProcessId=!curr_pid!" get CommandLine /value') do ( set "cmd_line=%%a" ) :: 转义路径中的反斜杠,适配WMI的查询语法 set "escaped_cmdline=!cmd_line:\=\\!" for /f "tokens=* delims=" %%a in ('wmic shortcutfile where "Target='!escaped_cmdline!'" get FileName /value') do ( set "lnk_fullpath=%%a" ) :: 提取快捷方式所在的文件夹路径 for %%a in ("!lnk_fullpath!") do ( set "shortcut_dir=%%~dpa" ) echo 调用当前脚本的快捷方式所在目录:!shortcut_dir! endlocal
注意事项
- 部分系统环境下,WMI查询可能需要管理员权限才能正常执行;
- 如果同时有多个cmd进程在运行同一个脚本,可能会出现匹配错误的情况,需要根据实际场景调整筛选逻辑。
方案二:用PowerShell读取快捷方式属性
PowerShell可以通过COM对象直接解析.lnk文件的属性,我们可以把PowerShell命令嵌入到批处理中,实现更灵活的查询:
@echo off setlocal enabledelayedexpansion :: 调用PowerShell查找所有指向当前脚本的快捷方式,并返回其所在目录 for /f "delims=" %%a in ('powershell -Command "$targetScript = '%~dpnx0'; $shell = New-Object -ComObject WScript.Shell; Get-ChildItem -Path 'C:\' -Filter '*.lnk' -Recurse -ErrorAction SilentlyContinue | ForEach-Object { $lnk = $shell.CreateShortcut($_.FullName); if ($lnk.TargetPath -eq $targetScript) { $_.DirectoryName } }"') do ( set "shortcut_dir=%%a" ) echo 调用当前脚本的快捷方式所在目录:!shortcut_dir! endlocal
优化提示
如果你的快捷方式只分布在特定目录(比如只在folderA、folderB里),可以把Get-ChildItem的-Path参数改成对应目录,这样能大幅提升查询速度。如果存在多个指向该脚本的快捷方式,还可以结合进程的启动信息进一步精准匹配。
内容的提问来源于stack exchange,提问作者Ould Abba
相关产品推荐
相关产品推荐

