当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 导入 PSSession (Microsoft.PowerShell.Utility)

作者:精品下载站 日期:2024-12-14 02:05:45 浏览:11 分类:玩电脑

导入 PSSession (Microsoft.PowerShell.Utility)


导入-PSSession

模块 :Microsoft.PowerShell.Utility

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

句法

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

描述

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

使用 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。

Import-PSSession cmdlet 使用 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

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

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

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

第三条和第四条命令使用当前会话中导入的命令。由于导入的命令实际上会添加到当前会话中,因此您可以使用本地语法来运行它们。您不需要使用 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,并从Server02 计算机。

即使 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 将 Test cmdlet 从 $S 中的 PSSession 导入到当前会话中。

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

第四个命令使用 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

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

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

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

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

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

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

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 将 Get-Date cmdlet 和 SearchHelp 函数导入当前会话。

Import-PSSession cmdlet 返回表示临时模块的 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

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

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

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

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

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

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

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

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

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

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

此命令从 $S 中的 PSSession 导入名称包含 Item 的命令。由于该命令包含 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 从 $S 变量中的 PSSession 导入名称包含“位”的命令。 Import-PSSession 命令返回一个临时模块,该命令将该模块保存在 $m 变量中。

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

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

Get-Command 命令相当于 Get-Command $M.Name”。

参数

-AllowClobber

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

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

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

类型 :

SwitchParameter

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-ArgumentList

指定使用指定参数(参数值)产生的命令数组。

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

类型 :

Object[]

别名:

Args

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-Certificate

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

输入包含证书的变量或获取证书的命令或表达式。

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

类型 :

X509证书2

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-CommandName

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

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

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

类型 :

String[]

别名:

Name

位置:

2

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-CommandType

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

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

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

类型 :

CommandTypes

别名:

Type

接受的值:

别名、函数、筛选器、Cmdlet、ExternalScript、应用程序、脚本、工作流、配置、全部

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-DisableNameChecking

指示当您导入名称中包含未经批准的动词或禁止字符的 cmdlet 或函数时,此 cmdlet 会禁止显示警告消息。

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

“警告:某些导入的命令名称包含未经批准的动词,这可能会使其不易被发现。使用 Verbose 参数了解更多详细信息,或输入 Get-Verb 查看批准的动词列表。”

此消息仅是警告。仍会导入完整的模块,包括不合格的命令。尽管该消息会显示给模块用户,但命名问题应由模块作者修复。

类型 :

SwitchParameter

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-FormatTypeName

指定指定 Microsoft .NET Framework 类型的格式化指令。输入类型名称。允许使用通配符。

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

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

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

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

类型 :

String[]

位置:

3

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-FullyQualifiedModule

该值可以是模块名称、完整模块规范或模块文件的路径。

当该值是路径时,该路径可以是完全限定的或相对的。相对路径是相对于包含 using 语句的脚本进行解析的。

当该值为名称或模块规范时,PowerShell 会在 PSModulePath 中搜索指定的模块。

模块规范是一个具有以下键的哈希表。

  • ModuleName - 必需 指定模块名称。
  • GUID - 可选 指定模块的 GUID。
  • 必需至少指定以下三个键之一。

    • ModuleVersion - 指定模块的最低可接受版本。
  • MaximumVersion - 指定模块可接受的最大版本。
  • RequiredVersion - 指定模块的准确、必需的版本。它不能与其他版本密钥一起使用。

您不能在同一命令中将 FullyQualifiedModule 参数指定为 Module 参数。这两个参数是互斥的。

类型 :

模块规格[]

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-Module

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

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

有关详细信息,请参阅 about_PSSnapins 和 about_Modules。

类型 :

String[]

别名:

PSSnapin

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-Prefix

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

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

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

类型 :

String

位置:

命名

默认值:

None

必需的:

False

接受管道输入:

False

接受通配符:

False

-Session

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

类型 :

PS会话

位置:

0

默认值:

None

必需的:

True

接受管道输入:

False

接受通配符:

False

输入

您无法通过管道将对象传递到此 cmdlet。

输出

PSModuleInfo

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

笔记

  • Import-PSSession 依赖于 PowerShell 远程处理基础设施。要使用此 cmdlet,必须将计算机配置为 WS-Management 远程处理。有关详细信息,请参阅 about_Remote 和 about_Remote_Requirements。
  • Import-PSSession 不会导入变量或 PowerShell 提供程序。
  • 当导入与当前会话中的命令同名的命令时,导入的命令可以隐藏会话中的别名、函数和 cmdlet,并且可以替换会话中的函数和变量。为了防止名称冲突,请使用前缀参数。有关详细信息,请参阅 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- 的 PSSession 导入命令。 ObjectGet-Help cmdlet。
  • 导入的命令与其他远程命令具有相同的限制,包括无法使用用户界面(例如记事本)启动程序。
  • 由于 Windows PowerShell 配置文件不在 PSSession 中运行,因此配置文件添加到会话的命令不可用于 Import-PSSession。要从配置文件导入命令,请在导入命令之前使用 Invoke-Command 命令在 PSSession 中手动运行配置文件。
  • 即使该命令不导入格式化数据,Import-PSSession 创建的临时模块也可能包含格式化文件。如果该命令不导入格式化数据,则创建的任何格式化文件将不包含格式化数据。
  • 要使用Import-PSSession,当前会话中的执行策略不能为Restricted或AllSigned,因为Import-PSSession创建的临时模块包含被禁止的未签名脚本文件这些政策。要使用 Import-PSSession 而不更改本地计算机的执行策略,请使用 Set-ExecutionPolicyScope 参数设置限制较少的执行单一进程的策略。
  • 在 Windows PowerShell 2.0 中,从另一个会话导入的命令的帮助主题不包含使用 Prefix 参数分配的前缀。要获取 Windows PowerShell 2.0 中导入命令的帮助,请使用原始(无前缀)命令名称。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯