PowerShell导入模块路径异常:如何用相对路径调用模块函数
问题描述
文件结构
C:\scripts\script.ps1 C:\scripts\my_file.json C:\scripts\modules\FileTools.psm1
模块代码(FileTools.psm1)
function Get-JsonFile { param ( [Parameter(Mandatory = $true)] [string]$FileName ) $JsonHashMap = Get-Content -Raw $Filename | ConvertFrom-Json return $JsonHashMap }
当前遇到的问题:在script.ps1中导入模块后,调用Get-JsonFile时必须传入带$PSScriptRoot的完整路径,否则函数会从模块所在的C:\scripts\modules目录查找文件,导致找不到my_file.json。希望能直接用相对路径调用:
Import-Module .\modules\FileTools.psm1 $stuff = Get-JsonFile -FileName my_file.json
同时不想在模块中硬编码相对路径(比如..\$Filename),因为模块的位置可能不是固定的子目录。
解决方案
可以通过获取调用者的上下文路径来解决这个问题,让函数使用调用者所在的目录来解析相对路径,而不是模块自身的目录。修改模块中的函数如下:
function Get-JsonFile { param ( [Parameter(Mandatory = $true)] [string]$FileName ) # 获取调用者的脚本目录,若为控制台调用则用当前工作目录 $callerPath = $PSCmdlet.GetVariableValue('PSScriptRoot', $PWD.Path) # 安全拼接完整路径 $fullPath = Join-Path -Path $callerPath -ChildPath $FileName # 读取并转换JSON文件 $JsonHashMap = Get-Content -Raw $fullPath | ConvertFrom-Json return $JsonHashMap }
原理说明
$PSCmdlet.GetVariableValue('PSScriptRoot', $PWD.Path):从调用者的作用域中获取脚本所在目录PSScriptRoot;如果是直接在控制台调用函数,则 fallback 到当前工作目录$PWD.Path。Join-Path:自动处理路径分隔符,避免手动拼接字符串出现的格式错误。
修改后,无论模块放在什么位置,只要调用者的目录下存在目标JSON文件,都可以直接传入相对路径,函数会自动解析到正确的文件位置。
内容的提问来源于stack exchange,提问作者soapdish
相关产品推荐
相关产品推荐

