通过快捷方式执行PowerShell脚本时获取正确启动目录
获取PowerShell快捷方式所在目录(PowerShell 5.x)
核心解决方案
以下脚本可自动定位启动当前PowerShell脚本的快捷方式(.lnk)所在目录,无需预先指定快捷路径:
# 获取当前PowerShell进程 $currentProcess = Get-Process -Id $PID # 获取父进程(通常是explorer.exe,即双击快捷方式的启动进程) $parentProcessInfo = Get-CimInstance Win32_Process -Filter "ProcessId = $($currentProcess.Id)" $parentProcess = Get-Process -Id $parentProcessInfo.ParentProcessId # 从父进程命令行中提取快捷方式(.lnk)路径 $lnkPathMatch = $parentProcess.CommandLine | Select-String -Pattern '"([^"]+\.lnk)"' -ErrorAction SilentlyContinue if ($lnkPathMatch) { $lnkFullPath = $lnkPathMatch.Matches.Groups[1].Value # 获取快捷方式所在目录 $shortcutDir = Split-Path -Path $lnkFullPath -Parent # 拼接目标Games目录 $gamesDirPath = Join-Path -Path $shortcutDir -ChildPath "Games" # 验证输出(可按需删除) Write-Host "快捷方式所在目录: $shortcutDir" Write-Host "Games目录路径: $gamesDirPath" } else { Write-Warning "未找到启动当前脚本的快捷方式文件,请确保通过.lnk快捷方式执行脚本。" }
关键说明
- 原理:双击快捷方式时,由
explorer.exe进程启动该快捷方式,其命令行参数中会包含完整的.lnk文件路径。通过解析父进程(explorer.exe)的命令行,即可提取快捷方式的位置。 - 兼容性:适用于PowerShell 5.x,无需额外安装模块,仅依赖系统自带的CIM和进程查询功能。
- 边界处理:如果脚本不是通过快捷方式启动(如直接在PowerShell中运行),会输出警告提示。
补充优化
如果需要处理父进程不是explorer.exe的场景(例如从其他脚本或工具启动快捷方式),可以扩展逻辑遍历所有进程查找关联的.lnk文件,但常规双击场景下上述代码已足够使用。
内容的提问来源于stack exchange,提问作者ElektroStudios
相关产品推荐
相关产品推荐

