New-Module

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

语法

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

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

说明

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

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

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

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

参数

-ArgumentList <Object[]>

指定传递给脚本块的实际参数(形式参数的值)。

是否为必需?

false

位置?

named

默认值

是否接受管道输入?

false

是否接受通配符?

false

-AsCustomObject

返回具有表示模块成员的成员的自定义对象。

使用 AsCustomObject 参数时,New-Module 创建动态模块,将模块成员导入当前会话,然后返回一个 PSCustomObject 对象而不是 PSModuleInfo 对象。可以将自定义对象保存在变量中并使用点表示法来调用成员。

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

是否为必需?

false

位置?

named

默认值

是否接受管道输入?

false

是否接受通配符?

false

-Cmdlet <string[]>

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

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

是否为必需?

false

位置?

named

默认值

是否接受管道输入?

false

是否接受通配符?

true

-Function <string[]>

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

是否为必需?

false

位置?

named

默认值

是否接受管道输入?

false

是否接受通配符?

true

-Name <string>

指定新模块的名称。也可将模块名称通过管道传送到 New-Module。

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

是否为必需?

true

位置?

1

默认值

"__DynamicModule_" + GUID

是否接受管道输入?

true (ByValue)

是否接受通配符?

false

-ReturnResult

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

是否为必需?

false

位置?

named

默认值

False

是否接受管道输入?

false

是否接受通配符?

false

-ScriptBlock <scriptblock>

指定动态模块的内容。用大括号 ({ }) 括起内容以形成脚本块。此参数是必需的。

是否为必需?

true

位置?

1

默认值

是否接受管道输入?

false

是否接受通配符?

false

<CommonParameters>

此 cmdlet 支持通用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_Commonparameters.

输入和输出

输入类型是指可通过管道传递给 cmdlet 的对象的类型。返回类型是指 Cmdlet 所返回对象的类型。

输入

System.String

可以将模块名称字符串通过管道传送到 New-Module。

输出

System.Management.Automation.PSModuleInfo、System.Management.Automation.PSCustomObject 或“无”

默认情况下,New-Module 生成 PSModuleInfo 对象。如果使用 AsCustomObject 参数,则生成 PSCustomObject 对象。如果使用 ReturnResult 参数,则返回对动态模块中的脚本块的评估结果。

说明

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

示例 1

C:\PS>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

C:\PS>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     : {}

C:\PS> get-module
C:\PS>

C:\PS> get-command Hello

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

说明
-----------
此示例演示动态模块不是由 Get-Module cmdlet 返回的,但它们导出的成员是由 Get-Command cmdlet 返回的。





示例 3

C:\PS>New-Module -scriptblock {$SayHelloHelp="Type 'SayHello', a space, and a name."; function SayHello ($name) { "Hello, $name" }; Export-ModuleMember -function SayHello -Variable SayHelloHelp}

C:\PS> $SayHelloHelp
Type 'SayHello', a space, and a name.

C:\PS> SayHello Jeffrey
Hello, Jeffrey

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

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





示例 4

C:\PS>new-module -scriptblock {function Hello {"Hello!"}} -name GreetingModule | import-module

C:\PS> 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     : {}


C:\PS> get-command hello

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

说明
-----------
此命令演示您可以通过将动态模块通过管道传送到 Import-Module cmdlet,使该动态模块可用于 Get-Module cmdlet。

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

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

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





示例 5

C:\PS>$m = new-module -scriptblock {function Hello ($name) {"Hello, $name"}; function Goodbye ($name) {"Goodbye, $name"}} -AsCustomObject

C:\PS> $m

C:\PS> $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();

PS C:\ps-test> $m.goodbye("Jane")
Goodbye, Jane

PS C:\ps-test> $m.hello("Manoj")
Hello, Manoj

PS C:\ps-test> goodbye Jane
Goodbye, Jane

PS C:\ps-test> hello Manoj
Hello, Manoj

说明
-----------
此示例说明如何使用 New-Module 的 AsCustomObject 参数生成一个自定义对象,该对象带有表示导出的函数的脚本方法。

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

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

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

第四个和第五个命令使用该脚本方法格式调用 Hello 和 Goodbye 函数。
 
第六个和第七个命令通过指定函数名和参数值来调用这些函数。





示例 6

C:\PS>new-module -scriptblock {function SayHello {"Hello, World!"}; SayHello} -returnResult

Hello, World!

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

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





另请参阅

概念

Get-Module
Import-Module
Remove-Module
Export-ModuleMember
about_Modules