Powershell使用Export-ModuleMember导出别名作用域设置问题
根因说明
PowerShell 5.1及更高版本调整了模块导出别名的默认作用域规则:通过Export-ModuleMember导出的别名默认仅存在于模块本地作用域,仅模块内部代码可调用,不会自动暴露到当前会话的全局作用域,这就是你原来的写法在旧版PowerShell可用、新版不可用的原因。
问题答疑
- 能否为
Export-ModuleMember导出的别名设置作用域?
不能,Export-ModuleMember没有提供作用域配置参数,无法直接修改它导出的别名的作用域层级。 - 能否在psd1文件中配置别名作用域?
不能,psd1文件中的AliasesToExport字段仅用于声明允许导出的别名范围,没有作用域配置项,无论设置为通配符还是具体别名列表,都不会改变导出别名的作用域。 - 不需要逐一修改
Export-ModuleMember语句添加New-Alias调用,可选择以下两种低成本方案:
方案1:修改模块代码,批量导出所有别名到全局
仅需在你现有.psm1文件的末尾添加以下代码即可,原有所有函数的[Alias()]注解、Export-ModuleMember语句完全不需要改动:
# 批量将当前模块所有导出别名注册到全局作用域 $currentModule = $MyInvocation.MyCommand.Module $allModuleAliases = Get-Alias -Module $currentModule.Name foreach ($aliasItem in $allModuleAliases) { New-Alias -Name $aliasItem.Name -Value $aliasItem.Definition -Scope Global -Force }
方案2:导入模块时添加全局参数,无需修改模块代码
导入模块时加上-Global参数,模块导出的所有函数、别名都会自动注册到全局作用域,原有模块代码完全不需要调整:
Import-Module (Join-Path $env:MODULE_PATH 'MyModule') -Force -Global
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

