Import-PSSession

将另一个会话中的命令导入当前会话中。

语法

Import-PSSession
      [-Prefix <String>]
      [-DisableNameChecking]
      [[-CommandName] <String[]>]
      [-AllowClobber]
      [-ArgumentList <Object[]>]
      [-CommandType <CommandTypes>]
      [-Module <String[]>]
      [-FullyQualifiedModule <ModuleSpecification[]>]
      [[-FormatTypeName] <String[]>]
      [-Certificate <X509Certificate2>]
      [-Session] <PSSession>
      [<CommonParameters>]

说明

cmdlet Import-PSSession 将命令(如 cmdlet、函数和别名)从本地或远程计算机上的 PSSession 导入到当前会话中。 可以导入 cmdlet 可以在 PSSession 中找到的任何命令 Get-Command

Import-PSSession使用 命令从自定义 shell(如 Microsoft Exchange Server shell)导入命令,或者从包含Windows PowerShell模块、管理单元或当前会话以外的其他元素的会话导入命令。

若要导入命令,请先使用 New-PSSession cmdlet 创建 PSSession。 然后,使用 Import-PSSession cmdlet 导入命令。 默认情况下, Import-PSSession 导入除与当前会话中的命令同名的命令之外的所有命令。 若要导入所有命令,请使用 AllowClobber 参数。

你可以使用导入的命令,如同你在会话中使用的任何命令一样。 当使用导入的命令时,命令的导入部分将在导出该命令的会话中隐式运行。 但是,远程操作完全由 Windows PowerShell 处理。 你甚至不需要注意它们,只不过必须使与另一个会话 (PSSession) 的连接保持打开状态。 如果关闭该链接,则导入的命令将不再可用。

由于导入的命令的运行时间可能比本地命令长, Import-PSSession 因此将 AsJob 参数添加到每个导入的命令。 此参数使你可以将该命令作为 Windows PowerShell 后台作业运行。 有关详细信息,请参阅 about_Jobs

使用 Import-PSSession时,Windows PowerShell将导入的命令添加到仅在会话中存在的临时模块,并返回表示该模块的对象。 若要创建可在将来的会话中使用的永久性模块,请使用 Export-PSSession cmdlet。

cmdlet Import-PSSession 使用 Windows PowerShell 的隐式远程处理功能。 将命令导入当前会话时,它们在原始会话或原始计算机上的类似会话中隐式运行。

从 Windows PowerShell 3.0 开始,可以使用 Import-Module cmdlet 将模块从远程会话导入当前会话。 此功能使用隐式远程处理。 它等效于使用 Import-PSSession 将所选模块从远程会话导入当前会话。

示例

示例 1:从 PSSession 导入所有命令

$S = New-PSSession -ComputerName Server01
Import-PSSession -Session $S

此命令将所有命令从 Server01 计算机上的 PSSession 导入到当前会话中,与当前会话中的命令具有相同名称的命令除外。

因为此命令不使用 CommandName 参数,所以它还会导入已导入命令所需的所有格式设置数据。

示例 2:导入以特定字符串结尾的命令

$S = New-PSSession https://ps.testlabs.com/powershell
Import-PSSession -Session $S -CommandName *-test -FormatTypeName *
New-Test -Name Test1
Get-Test test1 | Run-Test

这些命令会将 PSSession 中名称以“-test”结尾的命令导入本地会话,然后显示如何使用导入的 cmdlet。

第一个命令使用 New-PSSession cmdlet 创建 PSSession。 它将 PSSession 保存在 变量中 $S

第二个命令使用 Import-PSSession cmdlet 将命令从 中的 $S PSSession 导入到当前会话中。 它使用 CommandName 参数指定带有名词 Test 的命令,使用 FormatTypeName 参数来导入这些命令的格式设置数据。

第三个和第四个命令使用当前会话中导入的命令。 由于导入的命令实际添加到当前会话中,因此你将使用本地语法来运行它们。 无需使用 Invoke-Command cmdlet 来运行导入的命令。

示例 3:从 PSSession 导入 cmdlet

$S1 = New-PSSession -ComputerName s1
$S2 = New-PSSession -ComputerName s2
Import-PSSession -Session s1 -Type cmdlet -Name New-Test, Get-Test -FormatTypeName *
Import-PSSession -Session s2 -Type Cmdlet -Name Set-Test -FormatTypeName *
New-Test Test1 | Set-Test -RunType Full

此示例演示可以像使用本地 cmdlet 一样使用导入的 cmdlet。

这些命令从 Server01 计算机上的 PSSession 导入 New-TestGet-Test cmdlet,并从 Set-Test Server02 计算机上的 PSSession 导入 cmdlet。

尽管这些 cmdlet 从不同的 PSSession 中导入,但是可以通过管道将来自一个 cmdlet 的对象无误地传递到另一个 cmdlet。

示例 4:将导入的命令作为后台作业运行

$S = New-PSSession -ComputerName Server01
Import-PSSession -Session $S -CommandName *-test* -FormatTypeName *
$batch = New-Test -Name Batch -AsJob
Receive-Job $batch

此示例演示了如何将导入的命令作为后台作业运行。

由于导入的命令的运行时间可能比本地命令长, Import-PSSession 因此将 AsJob 参数添加到每个导入的命令。 AsJob 参数允许你将该命令作为后台作业运行。

第一个命令在 Server01 计算机上创建 PSSession 并将 PSSession 对象保存在 变量中 $S

第二个命令使用 Import-PSSession 将测试 cmdlet 从 中的 $S PSSession 导入到当前会话中。

第三个New-Test命令使用导入New-Test的 cmdlet 的 AsJob 参数将命令作为后台作业运行。 命令保存变量中$batch返回的作业对象New-Test

第四个 Receive-Job 命令使用 cmdlet 获取变量中 $batch 作业的结果。

示例 5:从Windows PowerShell模块导入 cmdlet 和函数

$S = New-PSSession -ComputerName Server01
Invoke-Command -Session $S {Import-Module TestManagement}
Import-PSSession -Session $S -Module TestManagement

此示例演示如何将远程计算机上的 Windows PowerShell 模块中的 cmdlet 和函数导入当前会话。

第一个命令在 Server01 计算机上创建 PSSession 并将其保存在 变量中 $S

第二个Import-Module命令使用 Invoke-Command cmdlet 在 中的 PSSession 中$S运行命令。

通常,模块将通过Windows PowerShell配置文件中的命令Import-Module添加到所有会话,但配置文件不会在 PSSession 中运行。

第三个命令使用 的 Import-PSSessionModule 参数将模块中的 cmdlet 和函数导入当前会话。

示例 6:在临时文件中Create模块

PS C:\> Import-PSSession $S -CommandName Get-Date, SearchHelp -FormatTypeName * -AllowClobber

Name              : tmp_79468106-4e1d-4d90-af97-1154f9317239_tcw1zunz.ttf
Path              : C:\Users\User01\AppData\Local\Temp\tmp_79468106-4e1d-4d90-af97-1154f9317239_tcw1
zunz.ttf\tmp_79468106-4e1d-4d90-af97-1154f9317239_
tcw1zunz.ttf.psm1
Description       : Implicit remoting for http://server01.corp.fabrikam.com/wsman
Guid              : 79468106-4e1d-4d90-af97-1154f9317239
Version           : 1.0
ModuleBase        : C:\Users\User01\AppData\Local\Temp\tmp_79468106-4e1d-4d90-af97-1154f9317239_tcw1
zunz.ttf
ModuleType        : Script
PrivateData       : {ImplicitRemoting}
AccessMode        : ReadWrite
ExportedAliases   : {}
ExportedCmdlets   : {}
ExportedFunctions : {[Get-Date, Get-Date], [SearchHelp, SearchHelp]}
ExportedVariables : {}
NestedModules     : {}

此示例演示如何 Import-PSSession 在磁盘上的临时文件中创建模块。 它还显示所有命令在导入当前会话之前都已转换为函数。

命令使用 Import-PSSession cmdlet 将 cmdlet 和 SearchHelp 函数导入 Get-Date 当前会话。

cmdlet Import-PSSession 返回表示临时模块的 PSModuleInfo 对象。 Path 属性的值显示在Import-PSSession临时位置 (.psm1) 文件创建了脚本模块。 ExportedFunctions 属性显示 Get-Date cmdlet 和 SearchHelp 函数都作为函数导入。

示例 7:运行由导入的命令隐藏的命令

PS C:\> Import-PSSession $S -CommandName Get-Date -FormatTypeName * -AllowClobber

PS C:\> Get-Command Get-Date -All

CommandType   Name       Definition
-----------   ----       ----------
Function      Get-Date   ...
Cmdlet        Get-Date   Get-Date [[-Date] <DateTime>] [-Year <Int32>] [-Month <Int32>]

PS C:\> Get-Date
09074

PS C:\> (Get-Command -Type Cmdlet -Name Get-Date).PSSnapin.Name
Microsoft.PowerShell.Utility

PS C:\> Microsoft.PowerShell.Utility\Get-Date
Sunday, March 15, 2009 2:08:26 PM

此示例演示如何运行导入的命令隐藏的命令。

第一个 Get-Date 命令从 变量中的 $S PSSession 导入 cmdlet。 由于当前会话包含 Get-Date cmdlet,因此命令中需要 AllowClobber 参数。

第二个命令使用 cmdlet 的 Get-CommandAll 参数获取Get-Date当前会话中的所有命令。 输出显示会话包含原始 Get-Date cmdlet 和 Get-Date 函数。 函数 Get-Date 在 中的 PSSession 中运行导入的 Get-Date$Scmdlet。

第三个命令运行命令 Get-Date 。 由于函数优先于 cmdlet,因此Windows PowerShell运行导入的Get-Date函数,这将返回一个 Julian 日期。

第四个和第五个命令显示如何使用限定的名称来运行由导入的命令隐藏的命令。

第四个命令获取将原始 Get-Date cmdlet 添加到当前会话的Windows PowerShell管理单元的名称。

第五个Get-Date命令使用 cmdlet 的管理Get-Date单元限定名称来运行命令。

有关命令优先级和隐藏的命令的详细信息,请参阅 about_Command_Precedence

示例 8:导入名称中包含特定字符串的命令

PS C:\> Import-PSSession -Session $S -CommandName **Item** -AllowClobber

此命令导入名称包括 中 PSSession 中的 Item 的 $S命令。 由于命令包含 CommandName 参数,但不包括 FormatTypeData 参数,因此仅导入命令。

使用 Import-PSSession 在远程计算机上运行命令,并且当前会话中已有命令的格式设置数据时,请使用此命令。

示例 9:使用 Module 参数发现哪些命令已导入会话

PS C:\> $M = Import-PSSession -Session $S -CommandName *bits* -FormatTypeName *bits*
PS C:\> Get-Command -Module $M
CommandType     Name
-----------     ----
Function        Add-BitsFile
Function        Complete-BitsTransfer
Function        Get-BitsTransfer
Function        Remove-BitsTransfer
Function        Resume-BitsTransfer
Function        Set-BitsTransfer
Function        Start-BitsTransfer
Function        Suspend-BitsTransfer

此命令演示如何使用 的 Get-CommandModule 参数来找出命令导入到会话Import-PSSession中的命令。

第一个命令使用 Import-PSSession cmdlet 导入名称包含变量中 PSSession 中的“位”的 $S 命令。 命令 Import-PSSession 返回一个临时模块,命令将模块保存在 变量中 $m

第二个命令使用 Get-Command cmdlet 获取模块在 变量中导出的 $M 命令。

Module 参数采用字符串值,这是为模块名称而设计的。 但是,当你提交模块对象时,Windows PowerShell 将对该模块对象使用 ToString 方法,然后返回模块名称。

命令 Get-Command 等效 Get-Command $M.Name于 “。

参数

-AllowClobber

指示此 cmdlet 导入指定的命令,即使它们与当前会话中的命令具有相同的名称。

如果导入与当前会话中的命令同名的命令,则导入的命令会隐藏或替换原始命令。 有关详细信息,请参阅 about_Command_Precedence

默认情况下, Import-PSSession 不会导入与当前会话中的命令同名的命令。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ArgumentList

指定通过使用指定的参数 (参数值) 得到的命令数组。

例如,若要在 的 PSSession $S的证书 (Cert:) 驱动器导入命令的变体Get-Item,请键入 Import-PSSession -Session $S -Command Get-Item -ArgumentList cert:

Type:Object[]
Aliases:Args
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Certificate

指定用于对格式化文件进行签名的客户端证书 (*。Format.ps1xml) 或脚本模块文件 (.psm1 在创建的临时模块 Import-PSSession 中) 。

输入一个包含证书的变量,或可获取该证书的命令或表达式。

若要查找证书,请使用 Get-PfxCertificate cmdlet 或使用 Get-ChildItem Certificate (Cert:) 驱动器中的 cmdlet。 如果证书无效或不具有足够的权限,则该命令将失败。

Type:X509Certificate2
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-CommandName

指定具有指定名称或名称模式的命令。 允许使用通配符。 使用 CommandName 或其别名 Name

默认情况下, Import-PSSession 从会话导入所有命令,但与当前会话中的命令具有相同名称的命令除外。 这样可以防止导入的命令隐藏或替换会话中的命令。 若要导入所有命令,甚至那些隐藏或替换其他命令的命令,请使用 AllowClobber 参数。

如果使用 CommandName 参数,则不导入这些命令的格式设置文件,除非使用 FormatTypeName 参数。 同样,如果使用 FormatTypeName 参数,则不导入任何命令,除非使用 CommandName 参数。

Type:String[]
Aliases:Name
Position:2
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-CommandType

指定命令对象的类型。 默认值为 Cmdlet。 使用 CommandType 或其别名 Type。 此参数的可接受值为:

  • Alias:远程会话中的Windows PowerShell别名。
  • All:远程会话中的 cmdlet 和函数。
  • Application:路径环境变量中列出的路径中除 Windows-PowerShell 文件以外的所有文件 ($env:path 远程会话中的) ,包括 .txt、.exe 和 .dll 文件。
  • Cmdlet:远程会话中的 cmdlet。 默认值为“Cmdlet”。
  • ExternalScript:路径环境变量中列出的路径中的 .ps1 文件 ($env:path 远程会话中的) 。
  • FilterFunction:Windows PowerShell在远程会话中函数。
  • Script:脚本在远程会话中阻止。

这些值定义为基于标志的枚举。 可以使用此参数将多个值组合在一起以设置多个标志。 可以将这些值作为值数组或这些值的逗号分隔字符串传递给 CommandType 参数。 该 cmdlet 将使用二进制 OR 操作合并值。 将值作为数组传递是最简单的选项,还允许对值使用 Tab 自动补全。

Type:CommandTypes
Aliases:Type
Accepted values:Alias, Function, Filter, Cmdlet, ExternalScript, Application, Script, Workflow, Configuration, All
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-DisableNameChecking

指示此 cmdlet 禁止在导入名称包含未经批准的谓词或禁止字符的 cmdlet 或函数时发出警告的消息。

默认情况下,当导入的模块导出名称中包含未经批准的谓词的 cmdlet 或函数时,Windows PowerShell将显示以下警告消息:

“警告:某些导入的命令名称包含未经批准的谓词,这可能会降低其可发现性。 使用 Verbose 参数了解更多详细信息或类型 Get-Verb ,以查看已批准的谓词列表。”

此消息只是一个警告。 仍将导入完整的模块,其中包括非一致性的命令。 尽管会向模块用户显示消息,但是模块作者应修复命名问题。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-FormatTypeName

指定指定 Microsoft .NET Framework类型的格式设置说明。 输入类型名称。 允许使用通配符。

此参数的值必须是从中导入命令的会话中的命令返回 Get-FormatData 的类型的名称。 若要获取远程会话中的所有格式设置数据,请键入 *

如果命令不包含 CommandNameFormatTypeName 参数,Import-PSSession则导入远程会话中命令返回Get-FormatData的所有.NET Framework类型的格式设置说明。

如果使用 FormatTypeName 参数,则不导入任何命令,除非使用 CommandName 参数。

同样,如果使用 CommandName 参数,则不导入这些命令的格式设置文件,除非使用 FormatTypeName 参数。

Type:String[]
Position:3
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-FullyQualifiedModule

指定名称以 ModuleSpecification 对象的形式指定的模块, (PowerShell SDK 中 ModuleSpecification 构造函数 (Hashtable) 中所述。 例如, FullyQualifiedModule 参数接受采用以下格式指定的模块名称:

  • @{ModuleName = "modulename"; ModuleVersion = "version_number"}
  • @{ModuleName = "modulename"; ModuleVersion = "version_number"; Guid = "GUID"}.

ModuleNameModuleVersion 是必需的,但 Guid 是可选的。

不能在与 Module 参数相同的命令中指定 FullyQualifiedModule 参数。 这两个参数互斥。

Type:ModuleSpecification[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Module

指定Windows PowerShell管理单元和模块中的命令和数组。 输入管理单元和模块的名称。 不允许使用通配符。

Import-PSSession 无法从管理单元导入提供程序。

有关详细信息,请参阅 about_PSSnapinsabout_Modules

Type:String[]
Aliases:PSSnapin
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Prefix

指定导入命令名称中名词的前缀。

使用此参数可避免会话中的不同命令具有相同名称时可能出现的名称冲突。

例如,如果指定前缀 Remote,然后导入 Get-Date cmdlet,则该 cmdlet 在会话 Get-RemoteDate中称为 ,并且不会与原始 Get-Date cmdlet 混淆。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Session

指定从中导入 cmdlet 的 PSSession 。 输入包含会话对象的变量或获取会话对象的命令,例如 New-PSSessionGet-PSSession 命令。 仅可以指定一个会话。 此参数是必需的。

Type:PSSession
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

输入

None

不能通过管道将对象传递给此 cmdlet。

输出

PSModuleInfo

Import-PSSession返回和 Get-Module cmdlet 返回的New-Module相同模块对象。 但是,导入的模块是临时的并且仅在当前会话中存在。 若要在磁盘上创建永久模块,请使用 Export-PSSession cmdlet。

备注

  • Import-PSSession 依赖于 PowerShell 远程处理基础结构。 若要使用此 cmdlet,必须为 WS-Management 远程处理配置计算机。 有关详细信息,请参阅 about_Remoteabout_Remote_Requirements
  • Import-PSSession 不导入变量或 PowerShell 提供程序。
  • 当你导入与当前会话中的命令具有相同名称的命令时,导入的命令可以隐藏会话中的别名、函数和 cmdlet,并且可以替换会话中的函数和变量。 若要防止名称冲突,请使用 Prefix 参数。 有关详细信息,请参阅 about_Command_Precedence
  • Import-PSSession 在导入命令之前,将所有命令转换为函数。 这样,导入的命令的行为与保留其原始命令类型时的行为稍有不同。 例如,如果从 PSSession 中导入一个 cmdlet,然后从模块或管理单元中导入具有相同名称的 cmdlet,则从 PSSession 中导入的 cmdlet 默认始终运行,因为函数优先于 cmdlet。 相反,如果将别名导入到具有相同名称的别名的会话,则始终使用原来的别名,因为别名优先于函数。 有关详细信息,请参阅 about_Command_Precedence
  • Import-PSSession 使用 Write-Progress cmdlet 显示命令的进度。 该命令正在运行时,你可能会看到进度条。
  • 若要查找要导入的命令, Import-PSSession 请使用 Invoke-Command cmdlet 在 PSSession 中运行 Get-Command 命令。 若要获取命令的格式设置数据,它使用 Get-FormatData cmdlet。 运行 Import-PSSession 命令时,可能会看到来自这些 cmdlet 的错误消息。 此外, Import-PSSession 无法从不包含 Get-CommandGet-FormatDataSelect-ObjectGet-Help cmdlet 的 PSSession 导入命令。
  • 导入的命令与其他远程命令具有相同的限制,包括无法通过用户界面(如“记事本”)启动程序。
  • 由于Windows PowerShell配置文件不在 PSSession 中运行,因此配置文件添加到会话中的命令对 不可用Import-PSSession。 若要从配置文件导入命令,请在 Invoke-Command 导入命令之前,使用 命令在 PSSession 中手动运行配置文件。
  • 创建的临时模块 Import-PSSession 可能包含格式设置文件,即使命令不导入格式设置数据也是如此。 如果该命令不导入格式数据,则创建的任何格式设置文件都不包含格式数据。
  • 若要使用 Import-PSSession,当前会话中的执行策略不能为“受限”或“AllSigned”,因为创建的临时模块 Import-PSSession 包含这些策略禁止的未签名脚本文件。 若要在不更改本地计算机的执行策略的情况下使用 Import-PSSession ,请使用 的 Set-ExecutionPolicyScope 参数为单个进程设置限制较少的执行策略。
  • 在 Windows PowerShell 2.0 中,从另一个会话中导入的命令的帮助主题不包括通过使用 Prefix 参数分配的前缀。 若要获得 Windows PowerShell 2.0 中导入命令的帮助,请使用原始(无前缀)的命令名称。