- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 psm1
文件中定义了一个变量,但是当我尝试在另一个脚本中访问它时,在导入模块后,我没有看到 psm1 中设置的值
文件。
globals.psm1
$blah = "hello world"
my-script.ps1
Import-Module "$PSScriptRoot\globals.psm1" -Force -Verbose
Write-Output "blah: ${blah}"
输出
PS C:\blah> .\my-script.ps1
VERBOSE: Loading module from path 'C:\blah\globals.psm1'.
blah: ''
我认为默认情况下会导出所有变量。我一定是打错了:
Specifies the variables that the module exports to the caller's session state. Wildcard characters are permitted. By default, all variables
('*')
are exported
来源:MSFT Docs -> How to write a PowerShell module manifest
(CTRL + F
在 'VariablesToExport' 上查找引用的文本)
是的,如果我导出变量,我可以访问它,但文档说:'默认情况下,所有变量 ('*')
都被导出,所以我做错了什么或误解了什么? 🤔
globals.psm1
$blah = "hello world"
Export-ModuleMember -Variable blah
最佳答案
您的模块没有使用module manifest (一个伴随的 .psd1
文件,在脚本模块的情况下,其 RootModule
入口指向您的 .psm1
文件),而您引用的文档与基于模块 list 的模块有关。
如果一个模块仅包含一个.psm1
文件,并且该文件不包含Export-ModuleMember
调用,以下规则适用:
只有函数和别名会自动导出。
相反,这意味着:为了也导出变量,您必须使用Export-ModuleMember
调用 - 如果您这样做,石板将被删除干净,可以这么说,并且您必须明确指定要导出的所有定义(在最简单的情况下,使用 Export-ModuleMember -Function * -Alias * -Variable *
).
此外,请务必将此调用置于 .psm1
文件的末尾,以确保已定义所有要导出的定义。
警告,如果使用 list (.psd1
):
list 的 *ToExport
键应用 在 .psm1
文件之上 - 隐式或显式 - 导出,即你可以使用它进一步缩小要导出的内容,通过显式枚举要导出的元素,这不仅使模块更具自描述性,而且在以下情况下也有助于提高性能PowerShell 自动发现可用但(尚未)导入的模块中的命令。
因此,如果基于 list 的模块想要导出变量,它也必须在其 .psm1
文件中有一个显式的 Export-ModuleMember
调用,使用 list 可能会缩小最终要导出的变量范围。
通常,最好避免从模块中导出变量,因为:
它增加了名称与别处定义的同名变量发生冲突的风险。
发现哪些变量由哪些模块导出并不像使用Get-Command
那样广为人知。是为了确定给定函数、cmdlet 或别名来自哪个模块。这是因为 (a) 导出变量的模块很少见,用户通常不会期望它,以及 (b) Get-Variable
cmdlet - 可以告诉您变量在哪个模块中定义 - 在实践中并不经常使用。
要查看给定模块导出哪些定义,请将 -Verbose
传递给 Import-Module
调用导入它。此外,传递 -Force
以强制重新加载已导入的模块。
关于powershell - 如何从 PowerShell 模块导出变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73215604/
我是一名优秀的程序员,十分优秀!