New-Module
创建一个仅存在于内存中的新动态模块。
语法
New-Module
[-ScriptBlock] <ScriptBlock>
[-Function <String[]>]
[-Cmdlet <String[]>]
[-ReturnResult]
[-AsCustomObject]
[-ArgumentList <Object[]>]
[<CommonParameters>]
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-Module
的 AsCustomObject 参数来返回作为自定义对象的动态模块。 将模块的成员(例如函数)实现为自定义对象的脚本方法,而不是将其导入到会话中。
动态模块只存在于内存中,而不在磁盘上。 类似于所有模块,动态模块的成员在专用模块作用域中运行,此作用域是全局作用域的子级。 Get-Module 无法获取动态模块,但 Get-Command 可以获取导出的成员。
若要使动态模块可供 Get-Module
使用,请通过管道将 New-Module
命令传递到 Import-Module,或者通过管道将 New-Module
返回的模块对象传递到 Import-Module
。 此操作将动态模块添加到 Get-Module
列表中,但它不会将模块保存到磁盘或使其保持不变。
示例
示例 1:创建动态模块
此示例使用名为 Hello
的函数创建新的动态模块。 此命令返回表示新的动态模块的模块对象。
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 : {}
示例 2:使用动态模块和 Get-Module 和 Get-Command
此示例演示 Get-Module
cmdlet 未返回动态模块。 导出的成员由 Get-Command
cmdlet 返回。
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!"
示例 3:将变量导出到当前会话
此示例使用 Export-ModuleMember
cmdlet 将变量导出到当前会话中。
如果没有 Export-ModuleMember
命令,则仅导出函数。
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
输出显示已将变量和函数导出到会话中。
示例 4:使动态模块可用于 Get-Module
此示例演示如何通过管道将动态模块传递给 Import-Module
,从而使动态模块可用于 Get-Module
。
New-Module
创建一个通过管道传递给 Import-Module
cmdlet 的模块对象。 New-Module
的 Name 参数将会为模块分配一个易记名称。 默认情况下,Import-Module
不返回任何对象,因此没有来自此命令的任何输出。 GreetingModule 已导入到当前会话的 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!"
Get-Command
cmdlet 显示动态模块导出的 Hello
函数。
示例 5:生成具有导出函数的自定义对象
此示例演示如何使用 New-Module
的 AsCustomObject 参数,以使用表示导出的函数的脚本方法生成一个自定义对象。
New-Module
cmdlet 将会创建一个动态模块,其中包含两个函数 Hello
和 Goodbye
。 AsCustomObject 参数将会创建一个自定义对象,而不是在默认情况下 New-Module
生成的 PSModuleInfo 对象。 此自定义对象保存在 $m
变量中。
$m
变量似乎没有赋值。
$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
通过管道将 $m
传递给 Get-Member
cmdlet 将显示自定义对象的属性和方法。 输出显示对象具有表示 Hello
和 Goodbye
函数的脚本方法。
最后,我们将调用这些脚本方法并显示结果。
示例 6:获取脚本块的结果
此示例使用 ReturnResult 参数来请求运行脚本块的结果,而不是请求模块对象。 新模块中的脚本块定义 SayHello
函数,然后调用该函数。
New-Module -ScriptBlock {function SayHello {"Hello, World!"}; SayHello} -ReturnResult
Hello, World!
参数
-ArgumentList
指定传递到脚本块的参数值的自变量数组。 有关 ArgumentList 的行为的详细信息,请参阅 about_Splatting。
类型: | Object[] |
别名: | Args |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-AsCustomObject
表示此 cmdlet 返回表示动态模块的自定义对象。 将模块成员实现为自定义对象的脚本方法,但是不将它们导入到会话中。 可以在变量中保存自定义对象,并使用点表示法来调用成员。
如果模块有多个具有相同名称的成员,如一个函数和一个变量都名为 A,则每个名称只有一个成员通过自定义对象进行访问。
类型: | SwitchParameter |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Cmdlet
指定此 cmdlet 从模块导出到当前会话的 cmdlet 数组。 输入以逗号分隔的 cmdlet 列表。 允许使用通配符。 默认情况下,导出模块中的所有 cmdlet。
你无法在脚本块中定义 cmdlet,但如果从二进制模块导入 cmdlet,则动态模块可以包含 cmdlet。
类型: | String[] |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Function
指定此 cmdlet 从模块导出到当前会话中的函数数组。 输入以逗号分隔的函数列表。 允许使用通配符。 默认情况下,导出模块中定义的所有函数。
类型: | String[] |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | True |
-Name
指定新模块的名称。 还可以通过管道将模块的名称传递给 New-Module。
默认值是自动生成的名称,它以 __DynamicModule_
开头而且后跟指定动态模块的路径的 GUID。
类型: | String |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | True |
接受通配符: | False |
-ReturnResult
表示此 cmdlet 运行脚本块并返回脚本块结果,而不是返回模块对象。
类型: | SwitchParameter |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-ScriptBlock
指定动态模块的内容。 用大括号 ({}
) 括起内容以创建脚本块。 此参数是必需的。
类型: | ScriptBlock |
Position: | 1 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
输入
可以将模块名称通过管道传递给此 cmdlet。
输出
此 cmdlet 将会生成一个 PSModuleInfo 对象。
如果使用 AsCustomObject 参数,它将生成 PSCustomObject 对象。
如果使用 ReturnResult 参数,则此 cmdlet 将返回在动态模块中评估脚本块的结果。
备注
PowerShell 包含 New-Module
的以下别名:
- 所有平台:
nmo