如何使用相对路径点源(Dot sourcing)位于$PSScriptRoot上级目录的脚本文件?
解决PowerShell中点源上级目录脚本的路径问题
你的问题出在路径的逻辑错误上:$PSScriptRoot本身就是当前脚本所在的绝对目录路径,你在它前面加..\会导致路径变成类似..\C:\Your\Script\Path\Functions\...这种无效格式——系统会把..\当成相对于当前工作目录的上级,再拼接绝对路径,这显然不符合你的预期。
下面是几种可靠的正确写法:
方法1:用Split-Path获取上级目录(推荐)
先通过Split-Path拿到当前脚本目录的上级目录,再用Join-Path安全拼接目标路径:
# 获取当前脚本目录的上级目录 $parentDirectory = Split-Path -Path $PSScriptRoot -Parent # 点源目标日志函数脚本 . (Join-Path -Path $parentDirectory -ChildPath "Functions\Logging_Functions.ps1")
这种方式完全基于脚本自身的位置,不受当前工作目录变化的影响,是最稳妥的写法。
方法2:用.NET Path类拼接路径
借助.NET的Path.Combine方法自动处理路径分隔符,再用Resolve-Path转换成绝对路径:
# 拼接相对上级的路径 $targetScriptPath = [System.IO.Path]::Combine($PSScriptRoot, "..", "Functions", "Logging_Functions.ps1") # 解析为绝对路径(避免残留相对标识) $resolvedPath = Resolve-Path -Path $targetScriptPath -ErrorAction Stop # 点源脚本 . $resolvedPath
Resolve-Path会帮你把..转换成实际的上级目录路径,确保路径绝对有效。
不推荐的写法(依赖工作目录)
如果你确定脚本运行时的当前工作目录就是脚本所在目录,也可以直接用相对路径:
. "..\Functions\Logging_Functions.ps1"
但这种写法风险很高——如果脚本被从其他目录调用(比如通过绝对路径执行),当前工作目录就不是脚本目录,相对路径会直接失效,所以不建议在生产脚本中使用。
总结一下:永远基于$PSScriptRoot构建绝对路径,不要把相对路径前缀和绝对路径变量混写,这样才能保证路径在任何场景下都有效。
内容的提问来源于stack exchange,提问作者Skeer
相关产品推荐
相关产品推荐

