gpt4 book ai didi

powershell - 如何从 PowerShell 模块导出变量

转载 作者:行者123 更新时间:2023-12-05 04:25:32 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com