PowerShell中using module ./为何指向用户目录而非执行目录?
PowerShell
using module相对路径失效问题解决 问题根源
using module语句是在PowerShell的代码解析阶段执行的,这个阶段的工作目录默认是当前用户的主目录(比如你的C:\Users\jreddy),而不是脚本实际存放的目录。这就导致你用./personClass.psm1时,PowerShell会去用户目录找模块,自然找不到同目录下的文件。
可行解决方案
方案1:用$PSScriptRoot构建绝对路径(推荐)
直接修改test.ps1里的模块加载语句,用PowerShell内置的$PSScriptRoot变量(自动指向当前脚本所在的绝对路径)拼接模块路径:
using module "$PSScriptRoot/personClass.psm1"
不管你从哪个目录运行test.ps1,这个变量都会准确定位到脚本所在文件夹,确保模块路径正确。
方案2:先切换工作目录再加载
如果不想用$PSScriptRoot,可以先切换到脚本所在目录,再加载模块:
Set-Location $PSScriptRoot using module ./personClass.psm1
注意:这种方式会改变当前PowerShell会话的工作目录,可能影响后续执行的其他命令,仅适合简单场景。
方案3:将模块放入默认模块目录
如果这个模块需要被多个脚本调用,可以把personClass.psm1放到PowerShell默认的模块目录中:
- 当前用户专属目录:
C:\Users\jreddy\Documents\WindowsPowerShell\Modules\personClass(要新建和模块同名的文件夹) - 系统全局目录:
C:\Program Files\WindowsPowerShell\Modules\personClass
之后直接用模块名加载即可:
using module personClass
这种方式适合通用模块,临时测试的话还是方案1更便捷。
内容的提问来源于stack exchange,提问作者Jeff Reddy
相关产品推荐
相关产品推荐

