You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:15:10