New-Module

创建一个新的动态模块,该模块仅存在于内存中。

语法

ScriptBlock (默认值)

New-Module
    [-ScriptBlock] <ScriptBlock>
    [-Function <String[]>]
    [-Cmdlet <String[]>]
    [-ReturnResult]
    [-AsCustomObject]
    [-ArgumentList <Object[]>]
    [<CommonParameters>]

Name

New-Module
    [-Name] <String>
    [-ScriptBlock] <ScriptBlock>
    [-Function <String[]>]
    [-Cmdlet <String[]>]
    [-ReturnResult]
    [-AsCustomObject]
    [-ArgumentList <Object[]>]
    [<CommonParameters>]

说明

New-Module cmdlet 从脚本块创建动态模块。 动态模块的成员(如函数和变量)在会话中立即可用,在关闭会话之前保持可用。

与静态模块一样,默认情况下,动态模块中的 cmdlet 和函数会被导出,而变量和别名则不会被导出。 但是,可以使用 Export-ModuleMember cmdlet 和 New-Module 的参数来替代默认值。

还可以使用 New-ModuleAsCustomObject 参数将动态模块作为自定义对象返回。 模块的成员(如函数)作为自定义对象的脚本方法实现,而不是导入到会话中。

动态模块仅存在于内存中,而不能存在于磁盘上。 与所有模块一样,动态模块的成员在私有模块作用域中运行,该作用域是全局作用域的子级。 Get-Module 无法获取动态模块,但 Get-Command 可以获取导出的成员。

若要使动态模块可用于 Get-Module,请通过管道将 New-Module 命令传递给 Import-Module,或者通过管道将 New-Module 返回的模块对象返回到 Import-Module。 此操作将动态模块添加到 Get-Module 列表中,但它不会将模块保存到磁盘或使其持久化。

示例

示例 1:创建动态模块

New-Module -ScriptBlock {function Hello {"Hello!"}}
Name              : __DynamicModule_2ceb1d0a-990f-45e4-9fe4-89f0f6ead0e5
Path              : 2ceb1d0a-990f-45e4-9fe4-89f0f6ead0e5
Description       :
Guid              : 00000000-0000-0000-0000-000000000000
Version           : 0.0
ModuleBase        :
ModuleType        : Script
PrivateData       :
AccessMode        : ReadWrite
ExportedAliases   : {}
ExportedCmdlets   : {}
ExportedFunctions : {[Hello, Hello]}
ExportedVariables : {}
NestedModules     : {}

此命令使用名为 Hello 的函数创建新的动态模块。 该命令返回一个表示新动态模块的模块对象。

示例 2:使用动态模块和 Get-Module 和 Get-Command

new-module -scriptblock {function Hello {"Hello!"}}
Name              : __DynamicModule_2ceb1d0a-990f-45e4-9fe4-89f0f6ead0e5
Path              : 2ceb1d0a-990f-45e4-9fe4-89f0f6ead0e5
Description       :
Guid              : 00000000-0000-0000-0000-000000000000
Version           : 0.0
ModuleBase        :
ModuleType        : Script
PrivateData       :
AccessMode        : ReadWrite
ExportedAliases   : {}
ExportedCmdlets   : {}
ExportedFunctions : {[Hello, Hello]}
ExportedVariables : {}
NestedModules     : {}
Get-Module

Get-Command Hello
CommandType     Name   Definition
-----------     ----   ----------
Function        Hello  "Hello!"

此示例演示了 Get-Module cmdlet 不返回动态模块。 导出的成员由 Get-Command cmdlet 返回。

示例 3:将变量导出到当前会话

New-Module -ScriptBlock {$SayHelloHelp="Type 'SayHello', a space, and a name."; function SayHello ($name) { "Hello, $name" }; Export-ModuleMember -function SayHello -Variable SayHelloHelp}
$SayHelloHelp
Type 'SayHello', a space, and a name.
SayHello Jeffrey
Hello, Jeffrey

此命令使用 Export-ModuleMember cmdlet 将变量导出到当前会话中。 如果没有 Export-ModuleMember 命令,则仅导出函数。

输出显示变量和函数都导出到会话中。

示例 4:使动态模块可用于 Get-Module

New-Module -ScriptBlock {function Hello {"Hello!"}} -name GreetingModule | Import-Module
Get-Module
Name              : GreetingModule
Path              : d54dfdac-4531-4db2-9dec-0b4b9c57a1e5
Description       :
Guid              : 00000000-0000-0000-0000-000000000000
Version           : 0.0
ModuleBase        :
ModuleType        : Script
PrivateData       :
AccessMode        : ReadWrite
ExportedAliases   : {}
ExportedCmdlets   : {}
ExportedFunctions : {[Hello, Hello]}
ExportedVariables : {}
NestedModules     : {}
Get-Command hello
CommandType     Name                                                               Definition
-----------     ----                                                               ----------
Function        Hello                                                              "Hello!"

此命令演示如何通过将动态模块管道 Import-Module,使动态模块可用于 Get-Module

第一个命令使用管道运算符 (|) 将 New-Module 生成的模块对象发送到 Import-Module cmdlet。 该命令使用 New-ModuleName 参数将友好名称分配给模块。 由于 Import-Module 默认情况下不返回任何对象,因此此命令没有输出。

第二个命令使用 Get-Module 来获取会话中的模块。 结果显示,Get-Module 可以获取新的动态模块。

第三个命令使用 Get-Command cmdlet 获取动态模块导出的 Hello 函数。

示例 5:生成具有导出函数的自定义对象

$m = New-Module -ScriptBlock {function Hello ($name) {"Hello, $name"}; function Goodbye ($name) {"Goodbye, $name"}} -AsCustomObject
$m
$m | Get-Member
TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Goodbye     ScriptMethod System.Object Goodbye();
Hello       ScriptMethod System.Object Hello();
$m.goodbye("Jane")
Goodbye, Jane
$m.hello("Manoj")
Hello, Manoj

此示例演示如何使用 New-ModuleAsCustomObject 参数生成表示导出函数的脚本方法的自定义对象。

第一个命令使用 New-Module cmdlet 生成具有两个函数 Hello 和 Goodbye 的动态模块。 该命令使用 AsCustomObject 参数生成自定义对象,而不是默认情况下 New-Module 生成的 PSModuleInfo 对象。 该命令将自定义对象保存在$m变量中。

第二个命令尝试显示$m变量的值。 未显示任何内容。

第三个命令使用管道运算符将自定义对象发送到 Get-Member cmdlet,该 cmdlet 显示自定义对象的属性和方法。 输出显示对象具有表示 Hello 和 Goodbye 函数的脚本方法。

第四个和第五个命令使用脚本方法格式调用 Hello 和 Goodbye 函数。

示例 6:获取脚本块的结果

New-Module -ScriptBlock {function SayHello {"Hello, World!"}; SayHello} -ReturnResult
Hello, World!

此命令使用 ReturnResult 参数请求运行脚本块的结果,而不是请求模块对象。

新模块中的脚本块定义 SayHello 函数,然后调用该函数。

参数

-ArgumentList

指定参数数组,这些参数是传递给脚本块的参数值。

参数属性

类型:

Object[]

默认值:None
支持通配符:False
不显示:False
别名:参数

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-AsCustomObject

指示此 cmdlet 返回表示动态模块的自定义对象。 模块成员作为自定义对象的脚本方法实现,但它们不会导入到会话中。 可以将自定义对象保存在变量中,并使用点表示法调用成员。

如果模块具有多个具有相同名称的成员,例如函数和两个都命名为 A 的变量,则只能从自定义对象访问具有每个名称的一个成员。

参数属性

类型:SwitchParameter
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-Cmdlet

指定一个 cmdlet 数组,此 cmdlet 将该数组从模块导出到当前会话中。 输入以逗号分隔的 cmdlet 列表。 允许使用通配符。 默认情况下,将导出模块中的所有 cmdlet。

不能在脚本块中定义 cmdlets,但如果动态模块从二进制模块导入了 cmdlets,则动态模块可以包含这些 cmdlets。

参数属性

类型:

String[]

默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-Function

指定此 cmdlet 从模块导出到当前会话的函数数组。 输入以逗号分隔的函数列表。 允许使用通配符。 默认情况下,导出模块中定义的所有函数。

参数属性

类型:

String[]

默认值:None
支持通配符:True
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-Name

指定新模块的名称。 还可以通过管道将模块名称传递给 New-Module。

默认值是自动生成的名称,以 __DynamicModule_ 开头,后跟指定动态模块路径的 GUID。

参数属性

类型:String
默认值:None
支持通配符:False
不显示:False

参数集

Name
Position:0
必需:True
来自管道的值:True
来自管道的值(按属性名称):False
来自剩余参数的值:False

-ReturnResult

指示此 cmdlet 运行脚本块并返回脚本块结果,而不是返回模块对象。

参数属性

类型:SwitchParameter
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-ScriptBlock

指定动态模块的内容。 将内容括在大括号 ({ }) 中以创建脚本块。 此参数是必需的。

参数属性

类型:ScriptBlock
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:1
必需:True
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

CommonParameters

此 cmdlet 支持通用参数:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 有关详细信息,请参阅 about_CommonParameters

输入

String

可以将模块名称通过管道传递给此 cmdlet。

输出

System.Management.Automation.PSModuleInfo, System.Management.Automation.PSCustomObject, or None

默认情况下,此 cmdlet 将生成 PSModuleInfo 对象。 如果使用 AsCustomObject 参数,它将生成 PSCustomObject 对象。 如果使用 ReturnResult 参数,它将返回在动态模块中评估脚本块的结果。

备注

  • 还可以通过别名 New-Module来引用 nmo。 有关详细信息,请参阅 about_Aliases