PowerShell脚本动态路径适配求助:USB盘符变更致脚本失效
解决PowerShell脚本路径动态获取的问题
方法1:利用$PSScriptRoot(最推荐)
$PSScriptRoot是PowerShell内置变量,会返回当前正在运行的脚本所在的目录路径。只要脚本之间的相对目录结构不变,不管你把整个文件夹移到哪个盘符、哪个位置,都能用它构建关联脚本的路径。
比如你的主脚本放在Windows installatie\Scripts目录下,要调用同级Menus子目录里的Apps.ps1,直接写:
& "$PSScriptRoot\Menus\Apps.ps1"
如果关联脚本在上级目录,比如主脚本在Menus里,要调用Scripts目录下的其他脚本,就用:
& "$PSScriptRoot\..\OtherScript.ps1"
方法2:搜索特定盘符找目标脚本
如果不确定脚本所在的盘符(比如USB盘符经常变更),可以用Get-ChildItem搜索指定盘符下的目标脚本:
# 定义要搜索的盘符范围,比如常见的USB盘符D、E、F $targetScript = Get-ChildItem -Path 'D:','E:','F:' -Filter 'Apps.ps1' -Recurse -File | Where-Object { $_.FullName -match 'Windows installatie\\Scripts\\Menus' } if ($targetScript) { & $targetScript.FullName } else { Write-Error "找不到目标脚本" }
这个方法会在指定盘符里递归查找符合路径规则的Apps.ps1,找到后直接调用。
方法3:先定位根目录再构建路径
如果知道脚本所在的根文件夹是Windows installatie,可以先定位这个根目录,再拼接完整路径:
# 从当前脚本目录向上回溯找到根目录(根据实际目录层级调整Parent的次数) $rootFolder = (Get-Item $PSScriptRoot).Parent.Parent.FullName & "$rootFolder\Scripts\Menus\Apps.ps1"
比如主脚本在Windows installatie\Scripts\Menus里,(Get-Item $PSScriptRoot).Parent.Parent就会返回Windows installatie的路径。
为什么直接用通配符调用无效?
&运算符需要接收明确的单个路径,直接写& '*\Windows installatie\Scripts\Menus\Apps.ps1'时,PowerShell不会自动展开通配符。如果想用通配符,得先通过Resolve-Path或Get-ChildItem把通配符转换成实际路径:
# 注意:如果找到多个匹配会报错,适合确定只有一个目标脚本的情况 & (Resolve-Path '*\Windows installatie\Scripts\Menus\Apps.ps1').Path
内容的提问来源于stack exchange,提问作者smurfexe
相关产品推荐
相关产品推荐

