Export-PSSession
从另一个会话导出命令,并将其保存在 PowerShell 模块中。
语法
Export-PSSession
[-OutputModule] <String>
[-Force]
[-Encoding <Encoding>]
[[-CommandName] <String[]>]
[-AllowClobber]
[-ArgumentList <Object[]>]
[-CommandType <CommandTypes>]
[-Module <String[]>]
[-FullyQualifiedModule <ModuleSpecification[]>]
[[-FormatTypeName] <String[]>]
[-Certificate <X509Certificate2>]
[-Session] <PSSession>
[<CommonParameters>]
说明
Export-PSSession
cmdlet 从本地或远程计算机上的另一个 PowerShell 会话(PSSession)获取 cmdlet、函数、别名和其他命令类型,并将其保存在 PowerShell 模块中。 若要将模块中的命令添加到当前会话,请使用 Import-Module
cmdlet。
与从另一个 PSSession 导入当前会话中的命令 Import-PSSession
不同,Export-PSSession
将命令保存在模块中。 这些命令不会导入到当前会话中。
若要导出命令,请使用 New-PSSession
cmdlet 创建具有要导出的命令的 PSSession。 然后使用 Export-PSSession
cmdlet 导出命令。
为防止命令名称冲突,Export-PSSession
的默认值是导出除当前会话中存在的命令之外的所有命令。 可以使用 CommandName 参数指定要导出的命令。
Export-PSSession
cmdlet 使用 PowerShell 的隐式远程处理功能。 将命令导入当前会话时,它们会在原始会话或原始计算机上的类似会话中隐式运行。
示例
示例 1:从 PSSession 导出命令
此示例从本地计算机创建新的 PSSession 到 Server01 计算机。 除当前会话中存在的命令外,所有命令都导出到本地计算机上的名为 Server01 的模块。 导出包括命令的格式设置数据。
$S = New-PSSession -ComputerName Server01
Export-PSSession -Session $S -OutputModule Server01
New-PSSession
命令在 Server01 计算机上创建 PSSession。 PSSession 存储在 $S
变量中。
Export-PSSession
命令将 $S
变量的命令和格式化数据导出到 Server01 模块中。
示例 2:导出 Get 和 Set 命令
此示例从服务器导出所有 Get
和 Set
命令。
$S = New-PSSession -ConnectionUri https://exchange.microsoft.com/mailbox -Credential exchangeadmin01@hotmail.com -Authentication Negotiate
Export-PSSession -Session $S -Module exch* -CommandName Get-*, Set-* -FormatTypeName * -OutputModule $PSHOME\Modules\Exchange -Encoding ASCII
这些命令将远程计算机上的 Microsoft Exchange Server 管理单元中的 Get
和 Set
命令导出到本地计算机上的 $PSHOME\Modules
目录中的 Exchange 模块。
将模块置于 $PSHOME\Modules
目录中后,计算机所有用户都可以访问该模块。
示例 3:从远程计算机导出命令
此示例从远程计算机上的 PSSession 导出 cmdlet,并将其保存在本地计算机上的模块中。 模块中的 cmdlet 将添加到当前会话中,以便可以使用它们。
$S = New-PSSession -ComputerName Server01 -Credential Server01\User01
Export-PSSession -Session $S -OutputModule TestCmdlets -Type Cmdlet -CommandName *test* -FormatTypeName *
Remove-PSSession $S
Import-Module TestCmdlets
Get-Help Test*
Test-Files
New-PSSession
命令在 Server01 计算机上创建 PSSession,并将其保存在 $S
变量中。
Export-PSSession
命令将名称以 Test 开头的 cmdlet 从 $S
中的 PSSession 导出到本地计算机上的 TestCmdlets 模块。
Remove-PSSession
cmdlet 从当前会话中删除 $S
中的 PSSession。 此命令显示 PSSession 不需要处于活动状态才能使用从会话导入的命令。
Import-Module
cmdlet 将 TestCmdlet 模块中的 cmdlet 添加到当前会话。 该命令可以随时在任何会话中运行。
Get-Help
cmdlet 获取其名称以 Test 开头的 cmdlet 的帮助。 将模块中的命令添加到当前会话后,可以使用 Get-Help
和 Get-Command
cmdlet 了解导入的命令。
Test-Files
cmdlet 已从 Server01 计算机导出并添加到会话。
Test-Files
cmdlet 在从中导入命令的计算机的远程会话中运行。 PowerShell 从 TestCmdlet 模块中存储的信息创建会话。
示例 4:当前会话中的导出和 clobber 命令
此示例将存储在变量中的命令导出到当前会话中。
Export-PSSession -Session $S -AllowClobber -OutputModule AllCommands
此 Export-PSSession
命令将所有命令和所有格式数据从 $S
变量中的 PSSession 导出到当前会话中。
AllowClobber 参数包含与当前会话中的命令同名的命令。
示例 5:从关闭的 PSSession 导出命令
此示例演示如何在关闭创建导出命令的 PSSession 时使用特殊选项运行导出的命令。
如果在导入模块时关闭原始远程会话,该模块将使用连接到发起计算机的任何打开的远程会话。 如果原始计算机没有当前会话,模块将重新建立会话。
若要在远程会话中使用特殊选项运行导出的命令,必须在导入模块之前使用这些选项创建远程会话。 将 New-PSSession
cmdlet 与 SessionOption 参数配合使用
$Options = New-PSSessionOption -NoMachineProfile
$S = New-PSSession -ComputerName Server01 -SessionOption $Options
Export-PSSession -Session $S -OutputModule Server01
Remove-PSSession $S
New-PSSession -ComputerName Server01 -SessionOption $Options
Import-Module Server01
New-PSSessionOption
cmdlet 创建 PSSessionOption 对象,并将对象保存在 $Options
变量中。
New-PSSession
命令在 Server01 计算机上创建 PSSession。
SessionOption 参数使用存储在 $Options
中的对象。 会话存储在 $S
变量中。
Export-PSSession
cmdlet 将命令从 $S
中的 PSSession 导出到 Server01 模块。
Remove-PSSession
cmdlet 删除 $S
变量中的 PSSession。
New-PSSession
cmdlet 创建连接到 Server01 计算机的新 PSSession。
SessionOption 参数使用存储在 $Options
中的对象。
Import-Module
cmdlet 从 Server01 模块导入命令。 模块中的命令在 Server01 计算机上的 PSSession 中运行。
参数
-AllowClobber
导出指定的命令,即使它们与当前会话中的命令具有相同的名称。
如果在当前会话中导出与命令同名的命令,则导出的命令将隐藏或替换原始命令。 有关详细信息,请参阅 about_Command_Precedence。
类型: | SwitchParameter |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-ArgumentList
导出使用指定参数(参数值)产生的命令变体。
例如,若要在 $S
的 PSSession 中导出证书(Cert:)驱动器中 Get-Item
命令的变体,请键入 Export-PSSession -Session $S -Command Get-Item -ArgumentList cert:
。
类型: | Object[] |
别名: | Args |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Certificate
指定用于对格式化文件进行签名的客户端证书(*)。Export-PSSession
创建的模块中的 Format.ps1xml 或脚本模块文件 (.psm1)。 输入包含证书的变量或获取证书的命令或表达式。
若要查找证书,请使用 Get-PfxCertificate
cmdlet 或使用 Certificate (Cert:) 驱动器中的 Get-ChildItem
cmdlet。 如果证书无效或没有足够的颁发机构,命令将失败。
类型: | X509Certificate2 |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-CommandName
仅导出具有指定名称或名称模式的命令。 允许通配符。 使用 CommandName 或其别名,Name。
默认情况下,Export-PSSession
从 PSSession 导出所有命令,但与当前会话中的命令具有相同名称的命令除外。 这样可以防止命令被当前会话中的命令隐藏或替换。 若要导出所有命令(即使是隐藏或替换其他命令的命令),请使用 AllowClobber 参数。
如果使用 CommandName 参数,则除非使用 FormatTypeName 参数,否则不会导出命令的格式设置文件。 同样,如果使用 FormatTypeName 参数,则除非使用 CommandName 参数,否则不会导出任何命令。
类型: | String[] |
别名: | Name |
Position: | 2 |
默认值: | All commands in the session. |
必需: | False |
接受管道输入: | False |
接受通配符: | True |
-CommandType
仅导出指定的命令对象类型。 使用 CommandType 或其别名,类型。
此参数的可接受值如下所示:
-
Alias
:当前会话中的所有 PowerShell 别名。 -
All
:所有命令类型。 它等效于Get-Command -Name *
。 -
Application
:路径环境变量($env:path
)中列出的路径中除 PowerShell 文件以外的所有文件,包括 .txt、.exe和 .dll 文件。 -
Cmdlet
:当前会话中的 cmdlet。 Cmdlet 是默认值。 -
Configuration
:PowerShell 配置。 有关详细信息,请参阅 about_Session_Configurations。 -
ExternalScript
:路径环境变量($env:path
)中列出的路径中的所有 .ps1 文件。 -
Filter
和Function
:所有 PowerShell 函数。 -
Script
当前会话中的脚本块。 -
Workflow
PowerShell 工作流。 有关详细信息,请参阅 about_Workflows。
这些值定义为基于标志的枚举。 可以使用此参数将多个值组合在一起以设置多个标志。 可以将值作为值数组或这些值的逗号分隔字符串传递给 CommandType 参数。 该 cmdlet 将使用二进制 OR作合并这些值。 将值作为数组传递是最简单的选项,还允许对值使用 Tab 补全。
类型: | CommandTypes |
别名: | Type |
接受的值: | Alias, All, Application, Cmdlet, Configuration, ExternalScript, Filter, Function, Script, Workflow |
Position: | Named |
默认值: | All commands in the session. |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Encoding
指定目标文件的编码类型。 默认值为 utf8NoBOM
。
此参数的可接受值如下所示:
-
ascii
:对 ASCII(7 位)字符集使用编码。 -
ansi
:对当前区域性的 ANSI 代码页使用编码。 此选项已在 PowerShell 7.4 中添加。 -
bigendianunicode
:使用 big-endian 字节顺序以 UTF-16 格式进行编码。 -
bigendianutf32
:使用 big-endian 字节顺序以 UTF-32 格式进行编码。 -
oem
:对 MS-DOS 和控制台程序使用默认编码。 -
unicode
:使用 little-endian 字节顺序以 UTF-16 格式进行编码。 -
utf7
:采用 UTF-7 格式编码。 -
utf8
:采用 UTF-8 格式编码。 -
utf8BOM
:使用字节顺序标记(BOM) 以 UTF-8 格式进行编码 -
utf8NoBOM
:不带字节顺序标记的 UTF-8 格式编码(BOM) -
utf32
:采用 UTF-32 格式编码。
从 PowerShell 6.2 开始,编码 参数还允许注册代码页(如 -Encoding 1251
)或已注册代码页(如 -Encoding "windows-1251"
)的字符串名称的数字 ID。 有关详细信息,请参阅 Encoding.CodePage.NET 文档。
从 PowerShell 7.4 开始,可以使用 Encoding 参数的 Ansi
值来传递当前区域性的 ANSI 代码页的数字 ID,而无需手动指定它。
注意
UTF-7* 不再推荐使用。 从 PowerShell 7.1 起,如果为 Encoding 参数指定 utf7
,则会编写警告。
类型: | Encoding |
接受的值: | ASCII, BigEndianUnicode, BigEndianUTF32, OEM, Unicode, UTF7, UTF8, UTF8BOM, UTF8NoBOM, UTF32 |
Position: | Named |
默认值: | UTF8NoBOM |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Force
覆盖一个或多个现有输出文件,即使该文件具有只读属性。
类型: | SwitchParameter |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-FormatTypeName
仅导出指定Microsoft .NET Framework 类型的格式设置说明。 输入类型名称。 默认情况下,Export-PSSession
导出 System.Management.Automation 命名空间中所有 .NET Framework 类型的格式设置说明。
此参数的值必须是从中导入命令的会话中 Get-FormatData
命令返回的类型的名称。 若要获取远程会话中的所有格式设置数据,请键入 *
。
如果使用 FormatTypeName 参数,则除非使用 CommandName 参数,否则不会导出任何命令。
如果使用 CommandName 参数,则除非使用 FormatTypeName 参数,否则不会导出命令的格式设置文件。
类型: | String[] |
Position: | 3 |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-FullyQualifiedModule
该值可以是模块名称、完整模块规范或模块文件的路径。
如果值为路径,则路径可以完全限定或相对。 相对于包含 using 语句的脚本解析相对路径。
当该值为名称或模块规范时,PowerShell 会在 PSModulePath 中搜索指定的模块。
模块规范是具有以下键的哈希表。
-
ModuleName
- 必需 指定模块名称。 -
GUID
- 可选 指定模块的 GUID。 - 它还 必需 指定以下三个键中的至少一个。
-
ModuleVersion
- 指定模块的最低可接受版本。 -
MaximumVersion
- 指定模块的最大可接受版本。 -
RequiredVersion
- 指定模块的确切所需版本。 这不能与其他版本密钥一起使用。
-
不能在与 Module 参数相同的命令中指定 FullyQualifiedModule 参数。 这两个参数互斥。
类型: | ModuleSpecification[] |
Position: | Named |
默认值: | None |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-Module
仅导出指定 PowerShell 管理单元和模块中的命令。 输入管理单元和模块名称。 不允许通配符。
有关详细信息,请参阅 Import-Module
和 about_PSSnapins。
类型: | String[] |
别名: | PSSnapin |
Position: | Named |
默认值: | All commands in the session. |
必需: | False |
接受管道输入: | False |
接受通配符: | False |
-OutputModule
指定由 Export-PSSession
创建的模块的可选路径和名称。 默认路径为 $HOME\Documents\WindowsPowerShell\Modules
。 此参数是必需的。
如果模块子目录或任何 Export-PSSession
创建的文件已存在,该命令将失败。 若要覆盖现有文件,请使用 Force 参数。
类型: | String |
别名: | PSPath, ModuleName |
Position: | 1 |
默认值: | $HOME\Documents\WindowsPowerShell\Modules |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
-Session
指定从中导出命令的 PSSession。 输入包含会话对象的变量或获取会话对象的命令,例如 Get-PSSession
命令。 此参数是必需的。
类型: | PSSession |
Position: | 0 |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
输入
None
不能通过管道将对象传递给此 cmdlet。
输出
此 cmdlet 返回构成其创建的模块的文件列表。
备注
Export-PSSession
依赖于 PowerShell 远程处理基础结构。 若要使用此 cmdlet,必须将计算机配置为远程处理。 有关详细信息,请参阅 about_Remote_Requirements。
不能使用 Export-PSSession
导出 PowerShell 提供程序。
导出的命令在导出的 PSSession 中隐式运行。 远程运行命令的详细信息完全由 PowerShell 处理。 可以像运行本地命令一样运行导出的命令。
Export-ModuleMember
捕获并保存有关它导出的模块中的 PSSession 的信息。 如果在导入模块时关闭导出命令的 PSSession,并且同一台计算机上没有活动的 PSSession,则模块中的命令将尝试重新创建 PSSession。 如果尝试重新创建 PSSession 失败,则导出的命令将不会运行。
Export-ModuleMember
捕获和保存模块中的会话信息不包括会话选项,例如在 $PSSessionOption
首选项变量中指定的会话信息,或者通过使用 New-PSSession
、Enter-PSSession
或 Invoke-Command
cmdlet 的 SessionOption 参数。 如果在导入模块时关闭了原始 PSSession,则模块将使用另一台 PSSession 连接到同一台计算机(如果有)。 若要使导入的命令能够在正确配置的会话中运行,请使用导入模块之前所需的选项创建 PSSession。
若要查找要导出的命令,Export-PSSession
使用 Invoke-Command
cmdlet 在 PSSession 中运行 Get-Command
命令。 若要获取和保存命令的格式设置数据,它使用 Get-FormatData
和 Export-FormatData
cmdlet。 运行 Export-PSSession
命令时,可能会看到来自 Invoke-Command
、Get-Command
、Get-FormatData
和 Export-FormatData
的错误消息。 此外,Export-PSSession
无法从不包含 Get-Command
、Get-FormatData
、Select-Object
和 Get-Help
cmdlet 的会话导出命令。
Export-PSSession
使用 Write-Progress
cmdlet 来显示命令的进度。 命令运行时,你可能会看到进度栏。
导出的命令与其他远程命令具有相同的限制,包括无法使用用户界面(如记事本)启动程序。
由于 PowerShell 配置文件未在 PSSessions 中运行,因此配置文件添加到会话的命令不适用于 Export-PSSession
。 若要从配置文件导出命令,请使用 Invoke-Command
命令在导出命令之前手动在 PSSession 中运行配置文件。
Export-PSSession
创建的模块可能包含格式化文件,即使命令不导入格式数据也是如此。 如果命令不导入格式数据,则创建的任何格式化文件都不会包含格式数据。