Invoke-Command

在本地和远程计算机上运行命令。

语法

Invoke-Command
      [-ScriptBlock] <ScriptBlock>
      [-NoNewScope]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-Session] <PSSession[]>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-FilePath] <String>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-Session] <PSSession[]>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-ComputerName] <String[]>]
      [-Credential <PSCredential>]
      [-Port <Int32>]
      [-UseSSL]
      [-ConfigurationName <String>]
      [-ApplicationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-InDisconnectedSession]
      [-SessionName <String[]>]
      [-HideComputerName]
      [-JobName <String>]
      [-FilePath] <String>
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-ComputerName] <String[]>]
      [-Credential <PSCredential>]
      [-Port <Int32>]
      [-UseSSL]
      [-ConfigurationName <String>]
      [-ApplicationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-InDisconnectedSession]
      [-SessionName <String[]>]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-CertificateThumbprint <String>]
      [<CommonParameters>]
Invoke-Command
      [-Credential <PSCredential>]
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [[-ConnectionUri] <Uri[]>]
      [-AsJob]
      [-InDisconnectedSession]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-AllowRedirection]
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-CertificateThumbprint <String>]
      [<CommonParameters>]
Invoke-Command
      [-Credential <PSCredential>]
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [[-ConnectionUri] <Uri[]>]
      [-AsJob]
      [-InDisconnectedSession]
      [-HideComputerName]
      [-JobName <String>]
      [-FilePath] <String>
      [-AllowRedirection]
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-ScriptBlock] <ScriptBlock>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-VMId] <Guid[]>
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-ScriptBlock] <ScriptBlock>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -VMName <String[]>
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-FilePath] <String>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-VMId] <Guid[]>
      [<CommonParameters>]
Invoke-Command
      -Credential <PSCredential>
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-FilePath] <String>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -VMName <String[]>
      [<CommonParameters>]
Invoke-Command
      [-Port <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      -HostName <String[]>
      [-UserName <String>]
      [-KeyFilePath <String>]
      [-SSHTransport]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [-Subsystem <String>]
      [<CommonParameters>]
Invoke-Command
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      [-RunAsAdministrator]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -ContainerId <String[]>
      [<CommonParameters>]
Invoke-Command
      [-ConfigurationName <String>]
      [-ThrottleLimit <Int32>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-FilePath] <String>
      [-RunAsAdministrator]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      -ContainerId <String[]>
      [<CommonParameters>]
Invoke-Command
      [-AsJob]
      [-HideComputerName]
      [-JobName <String>]
      [-ScriptBlock] <ScriptBlock>
      -SSHConnection <Hashtable[]>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-AsJob]
      [-HideComputerName]
      -FilePath <String>
      -HostName <String[]>
      [-UserName <String>]
      [-KeyFilePath <String>]
      [-SSHTransport]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-AsJob]
      [-HideComputerName]
      -FilePath <String>
      -SSHConnection <Hashtable[]>
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]

说明

Invoke-Command cmdlet 在本地或远程计算机上运行命令,并返回命令的所有输出,包括错误。 使用单个 Invoke-Command 命令,可以在多台计算机上运行命令。

若要在远程计算机上运行单个命令,请使用 ComputerName 参数。 若要运行共享数据的一系列相关命令,请使用 New-PSSession cmdlet 在远程计算机上创建 PSSession(持久连接),然后使用 Invoke-CommandSession 参数在 PSSession中运行该命令。 若要在断开连接的会话中运行命令,请使用 InDisconnectedSession 参数。 若要在后台作业中运行命令,请使用 AsJob 参数。

还可以在本地计算机上使用 Invoke-Command 作为命令运行脚本块。 PowerShell 立即在当前范围的子作用域中运行脚本块。

在使用 Invoke-Command 在远程计算机上运行命令之前,请阅读 about_Remote

从 PowerShell 6.0 开始,可以使用安全外壳(SSH)建立与远程计算机上的命令建立连接并调用命令。 SSH 必须安装在本地计算机上,并且必须使用 PowerShell SSH 终结点配置远程计算机。 基于 SSH 的 PowerShell 远程会话的优点是,它可以跨多个平台(Windows、Linux、macOS)工作。 对于基于 SSH 的会话,请使用 HostNameSSHConnection 参数来指定远程计算机和相关连接信息。 有关如何设置 PowerShell SSH 远程处理的详细信息,请参阅 PowerShell 远程处理 Over SSH

一些代码示例使用喷洒来减少行长。 有关详细信息,请参阅 about_Splatting

示例

示例 1:在服务器上运行脚本

此示例在 Server01 计算机上运行 Test.ps1 脚本。

Invoke-Command -FilePath c:\scripts\test.ps1 -ComputerName Server01

FilePath 参数指定位于本地计算机上的脚本。 脚本在远程计算机上运行,结果将返回到本地计算机。

示例 2:在远程服务器上运行命令

此示例在 Server01 远程计算机上运行 Get-Culture 命令。

Invoke-Command -ComputerName Server01 -Credential Domain01\User01 -ScriptBlock { Get-Culture }

ComputerName 参数指定远程计算机的名称。 Credential 参数用于在 Domain01\User01(有权运行命令的用户)的安全上下文中运行该命令。 ScriptBlock 参数指定要在远程计算机上运行的命令。

作为响应,PowerShell 请求 User01 帐户的密码和身份验证方法。 然后,它会在 Server01 计算机上运行命令并返回结果。

示例 3:在持久性连接中运行命令

此示例在名为 Server02 的远程计算机上使用持久性连接在会话中运行相同的 Get-Culture 命令。

$s = New-PSSession -ComputerName Server02 -Credential Domain01\User01
Invoke-Command -Session $s -ScriptBlock {Get-Culture}

New-PSSession cmdlet 在 Server02 远程计算机上创建会话,并将其保存在 $s 变量中。 通常,仅在远程计算机上运行一系列命令时创建会话。

Invoke-Command cmdlet 在 Server02 上运行 Get-Culture 命令。 Session 参数指定保存在 $s 变量中的会话。

作为响应,PowerShell 在 Server02 计算机上的会话中运行命令。

示例 4:使用会话运行共享数据的一系列命令

此示例比较了使用 ComputerNameSession 参数 Invoke-Command的效果。 它演示如何使用会话运行共享相同数据的一系列命令。

Invoke-Command -ComputerName Server02 -ScriptBlock {$p = Get-Process PowerShell}
Invoke-Command -ComputerName Server02 -ScriptBlock {$p.VirtualMemorySize}
$s = New-PSSession -ComputerName Server02
Invoke-Command -Session $s -ScriptBlock {$p = Get-Process PowerShell}
Invoke-Command -Session $s -ScriptBlock {$p.VirtualMemorySize}

17930240

前两个命令使用 Invoke-CommandComputerName 参数在 Server02 远程计算机上运行命令。 第一个命令使用 Get-Process cmdlet 获取远程计算机上的 PowerShell 进程,并将其保存在 $p 变量中。 第二个命令获取 PowerShell 进程的 VirtualMemorySize 属性的值。

使用 ComputerName 参数时,PowerShell 会创建一个新会话来运行该命令。 该会话在命令完成时关闭。 $p 变量是在一个连接中创建的,但它不存在于为第二个命令创建的连接中。

通过在远程计算机上创建持久会话,然后在同一会话中运行这两个命令来解决该问题。

New-PSSession cmdlet 在计算机 Server02 上创建持久会话,并将会话保存在 $s 变量中。 后面的 Invoke-Command 行使用 Session 参数在同一会话中运行这两个命令。 由于这两个命令在同一会话中运行,因此 $p 值保持活动状态。

示例 5:使用存储在变量中的脚本块调用命令

此示例演示如何运行作为脚本块存储在变量中的命令。 将脚本块保存在变量中时,可以将变量指定为 ScriptBlock 参数的值。

$command = { Get-WinEvent -LogName PowerShellCore/Operational |
  Where-Object {$_.Message -like "*certificate*"} }
Invoke-Command -ComputerName S1, S2 -ScriptBlock $command

$command 变量存储格式化为脚本块的 Get-WinEvent 命令。 Invoke-Command 运行存储在 S1 和 S2 远程计算机上的 $command 中的命令。

示例 6:在多台计算机上运行单个命令

此示例演示如何使用 Invoke-Command 在多台计算机上运行单个命令。

$parameters = @{
  ComputerName = "Server01", "Server02", "TST-0143", "localhost"
  ConfigurationName = 'MySession.PowerShell'
  ScriptBlock = { Get-WinEvent -LogName PowerShellCore/Operational }
}
Invoke-Command @parameters

ComputerName 参数指定以逗号分隔的计算机名称列表。 计算机列表包括 localhost 值,该值表示本地计算机。 ConfigurationName 参数指定备用会话配置。 ScriptBlock 参数 Get-WinEvent 运行,从每台计算机获取 PowerShellCore/Operational 事件日志。

示例 7:获取多台计算机上的主机程序版本

此示例获取在 200 台远程计算机上运行的 PowerShell 主机程序的版本。

$version = Invoke-Command -ComputerName (Get-Content Machines.txt) -ScriptBlock {(Get-Host).Version}

由于仅运行一个命令,因此无需创建与每台计算机的持久连接。 相反,该命令使用 ComputerName 参数来指示计算机。 若要指定计算机,它使用 Get-Content cmdlet 获取 Machine.txt 文件(计算机名称文件)的内容。

Invoke-Command cmdlet 在远程计算机上运行 Get-Host 命令。 它使用点表示法获取 PowerShell 主机的 Version 属性。

这些命令一次运行一个。 命令完成后,所有计算机的命令输出将保存在 $version 变量中。 输出包括数据源自的计算机的名称。

示例 8:在多台远程计算机上运行后台作业

此示例在两台远程计算机上运行命令。 Invoke-Command 命令使用 AsJob 参数,以便命令作为后台作业运行。 这些命令在远程计算机上运行,但作业存在于本地计算机上。 结果将传输到本地计算机。

$s = New-PSSession -ComputerName Server01, Server02
Invoke-Command -Session $s -ScriptBlock {Get-EventLog system} -AsJob

Id   Name    State      HasMoreData   Location           Command
---  ----    -----      -----         -----------        ---------------
1    Job1    Running    True          Server01,Server02  Get-EventLog system

$j = Get-Job
$j | Format-List -Property *

HasMoreData   : True
StatusMessage :
Location      : Server01,Server02
Command       : Get-EventLog system
JobStateInfo  : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : e124bb59-8cb2-498b-a0d2-2e07d4e030ca
Id            : 1
Name          : Job1
ChildJobs     : {Job2, Job3}
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}
StateChanged  :

$results = $j | Receive-Job

New-PSSession cmdlet 在 Server01 和 Server02 远程计算机上创建会话。 Invoke-Command cmdlet 在每个会话中运行后台作业。 该命令使用 AsJob 参数将命令作为后台作业运行。 此命令返回一个作业对象,该对象包含两个子作业对象,一个用于两个远程计算机上运行的作业。

Get-Job 命令将作业对象保存在 $j 变量中。 然后,$j 变量通过管道传递给 Format-List cmdlet 以显示列表中作业对象的所有属性。 最后一个命令获取作业的结果。 它通过管道将 $j 中的作业对象传递给 Receive-Job cmdlet,并将结果存储在 $results 变量中。

示例 9:在远程计算机上运行的命令中包含局部变量

此示例演示如何在远程计算机上运行的命令中包含局部变量的值。 该命令使用 Using 范围修饰符来标识远程命令中的局部变量。 默认情况下,所有变量都假定在远程会话中定义。 PowerShell 3.0 中引入了 Using 范围修饰符。 有关 Using 范围修饰符的详细信息,请参阅 about_Remote_Variablesabout_Scopes

$Log = "PowerShellCore/Operational"
Invoke-Command -ComputerName Server01 -ScriptBlock {Get-WinEvent -LogName $Using:Log -MaxEvents 10}

$Log 变量存储事件日志的名称 PowerShellCore/Operational。 Invoke-Command cmdlet 在 Server01 上运行 Get-WinEvent,从事件日志中获取十个最新事件。 LogName 参数的值是 $Log 变量,该变量以 Using 范围修饰符为前缀,指示它是在本地会话中创建的,而不是在远程会话中创建的。

示例 10:隐藏计算机名称

此示例显示使用 Invoke-CommandHideComputerName 参数的效果。 HideComputerName 不会更改此 cmdlet 返回的对象。 它仅更改显示。 仍可以使用 Format cmdlet 显示任何受影响对象的 PsComputerName 属性。

Invoke-Command -ComputerName S1, S2 -ScriptBlock {Get-Process PowerShell}

PSComputerName    Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   ProcessName
--------------    -------  ------    -----      ----- -----   ------     --   -----------
S1                575      15        45100      40988   200     4.68     1392 PowerShell
S2                777      14        35100      30988   150     3.68     67   PowerShell

Invoke-Command -ComputerName S1, S2 -ScriptBlock {Get-Process PowerShell} -HideComputerName

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   ProcessName
-------  ------    -----      ----- -----   ------     --   -----------
575      15        45100      40988   200     4.68     1392 PowerShell
777      14        35100      30988   150     3.68     67   PowerShell

前两个命令使用 Invoke-Command 为 PowerShell 进程运行 Get-Process 命令。 第一个命令的输出包括 PsComputerName 属性,该属性包含运行命令的计算机的名称。 第二个命令的输出,它使用 HideComputerName,不包括 PsComputerName 列。

示例 11:在脚本块中使用 Param 关键字

Param 关键字和 ArgumentList 参数用于将变量值传递给脚本块中的命名参数。 此示例显示以字母 a 开头且扩展名为 .pdf 的文件名。

有关 Param 关键字的详细信息,请参阅 about_Language_Keywords

$parameters = @{
    ComputerName = "Server01"
    ScriptBlock = { Param ($param1,$param2) Get-ChildItem -Name $param1 -Include $param2 }
    ArgumentList = "a*", "*.pdf"
}
Invoke-Command @parameters

aa.pdf
ab.pdf
ac.pdf
az.pdf

Invoke-Command 使用 ScriptBlock 参数来定义两个变量,$param1$param2Get-ChildItem 使用命名参数、名称包含变量名称的 IncludeArgumentList 将值传递给变量。

示例 12:在脚本块中使用$args自动变量

$args 自动变量和 ArgumentList 参数用于将数组值传递给脚本块中的参数位置。 此示例显示服务器 .txt 文件的目录内容。 Get-ChildItem Path 参数的位置为 0,Filter 参数的位置为 1。

有关 $args 变量的详细信息,请参阅 about_Automatic_Variables

$parameters = @{
    ComputerName = "Server01"
    ScriptBlock = { Get-ChildItem $args[0] $args[1] }
    ArgumentList = "C:\Test", "*.txt*"
}
Invoke-Command @parameters

Directory: C:\Test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           6/12/2019    15:15            128 alog.txt
-a---           7/27/2019    15:16            256 blog.txt
-a---           9/28/2019    17:10             64 zlog.txt

Invoke-Command 使用 ScriptBlock 参数,Get-ChildItem 指定 $args[0]$args[1] 数组值。 ArgumentList$args 数组值传递给 PathFilterGet-ChildItem 参数位置。

示例 13:在文本文件中列出的所有计算机上运行脚本

此示例使用 Invoke-Command cmdlet 在 Servers.txt 文件中列出的所有计算机上运行 Sample.ps1 脚本。 该命令使用 FilePath 参数来指定脚本文件。 此命令允许在远程计算机上运行脚本,即使远程计算机无法访问脚本文件。

Invoke-Command -ComputerName (Get-Content Servers.txt) -FilePath C:\Scripts\Sample.ps1 -ArgumentList Process, Service

提交命令时,将 Sample.ps1 文件的内容复制到脚本块中,脚本块在每个远程计算机上运行。 此过程等效于使用 ScriptBlock 参数提交脚本的内容。

示例 14:使用 URI 在远程计算机上运行命令

此示例演示如何在统一资源标识符(URI)标识的远程计算机上运行命令。 此特定示例在远程 Exchange 服务器上运行 Set-Mailbox 命令。

$LiveCred = Get-Credential
$parameters = @{
  ConfigurationName = 'Microsoft.Exchange'
  ConnectionUri = 'https://ps.exchangelabs.com/PowerShell'
  Credential = $LiveCred
  Authentication = 'Basic'
  ScriptBlock = {Set-Mailbox Dan -DisplayName "Dan Park"}
}
Invoke-Command @parameters

第一行使用 Get-Credential cmdlet 将 Windows Live ID 凭据存储在 $LiveCred 变量中。 PowerShell 提示用户输入 Windows Live ID 凭据。

$parameters 变量是一个哈希表,其中包含要传递给 Invoke-Command cmdlet 的参数。 Invoke-Command cmdlet 使用 Microsoft.Exchange 会话配置运行 Set-Mailbox 命令。 ConnectionURI 参数指定 Exchange 服务器终结点的 URL。 Credential 参数指定存储在 $LiveCred 变量中的凭据。 AuthenticationMechanism 参数指定基本身份验证的使用。 ScriptBlock 参数指定包含命令的脚本块。

示例 15:使用会话选项

此示例演示如何创建和使用 SessionOption 参数。

$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
Invoke-Command -ComputerName server01 -UseSSL -ScriptBlock { Get-HotFix } -SessionOption $so -Credential server01\user01

New-PSSessionOption cmdlet 创建一个会话选项对象,该对象导致远程端在评估传入 HTTPS 连接时不验证证书颁发机构、规范名称和吊销列表。 SessionOption 对象保存在 $so 变量中。

注意

禁用这些检查有助于进行故障排除,但显然不安全。

Invoke-Command cmdlet 远程运行 Get-HotFix 命令。 SessionOption 参数给定 $so 变量。

示例 16:在远程命令中管理 URI 重定向

此示例演示如何使用 AllowRedirectionSessionOption 参数来管理远程命令中的 URI 重定向。

$max = New-PSSessionOption -MaximumRedirection 1
$parameters = @{
  ConnectionUri = "https://ps.exchangelabs.com/PowerShell"
  ScriptBlock = { Get-Mailbox dan }
  AllowRedirection = $true
  SessionOption = $max
}
Invoke-Command @parameters

New-PSSessionOption cmdlet 创建保存在 $max 变量中的 PSSessionOption 对象。 该命令使用 MaximumRedirection 参数将 PSSessionOption 对象的 MaximumConnectionRedirectionCount 属性设置为 1。

Invoke-Command cmdlet 在远程 Microsoft Exchange Server 上运行 Get-Mailbox 命令。 AllowRedirection 参数提供将连接重定向到备用终结点的显式权限。 SessionOption 参数使用存储在 $max 变量中的会话对象。

因此,如果由 ConnectionURI 指定的远程计算机 返回重定向消息,则 PowerShell 将重定向连接,但如果新目标返回另一个重定向消息,则会超过重定向计数值 1,Invoke-Command 返回非终止错误。

示例 17:访问远程会话中的网络共享

此示例演示如何从远程会话访问网络共享。 三台计算机用于演示该示例。 Server01 是本地计算机,Server02 是远程计算机,Net03 包含网络共享。 Server01 连接到 Server02,然后 Server02 执行第二个跃点到 Net03 以访问网络共享。 有关 PowerShell 远程处理如何支持计算机之间的跃点的详细信息,请参阅 使 PowerShell 远程处理中的第二个跃点。

所需的凭据安全支持提供程序(CredSSP)委派在本地计算机上的客户端设置和远程计算机上的服务设置中启用。 若要运行此示例中的命令,你必须是本地计算机和远程计算机上的 管理员 组的成员。

Enable-WSManCredSSP -Role Client -DelegateComputer Server02
$s = New-PSSession Server02
Invoke-Command -Session $s -ScriptBlock {Enable-WSManCredSSP -Role Server -Force}
$parameters = @{
  ComputerName = 'Server02'
  ScriptBlock = { Get-Item \\Net03\Scripts\LogFiles.ps1 }
  Authentication = "CredSSP"
  Credential = "Domain01\Admin01"
}
Invoke-Command @parameters

Enable-WSManCredSSP cmdlet 允许从 Server01 本地计算机到 Server02 远程计算机的 CredSSP 委派。 Role 参数指定 客户端 在本地计算机上配置 CredSSP 客户端设置。

New-PSSession 为 Server02 创建 PSSession 对象,并将对象存储在 $s 变量中。

Invoke-Command cmdlet 使用 $s 变量连接到远程计算机 Server02。 ScriptBlock 参数在远程计算机上运行 Enable-WSManCredSSPRole 参数指定 服务器 在远程计算机上配置 CredSSP 服务器设置。

$parameters 变量包含连接到网络共享的参数值。 Invoke-Command cmdlet 在 $s中的会话中运行 Get-Item 命令。 此命令从 \\Net03\Scripts 网络共享获取脚本。 该命令使用 Authentication 参数,其值为 CredSSP,并使用值为 Domain01\Admin01Credential 参数。

示例 18:在许多远程计算机上启动脚本

此示例在一百多台计算机上运行脚本。 为了尽量减少对本地计算机的影响,它会连接到每台计算机,启动脚本,然后断开与每台计算机的连接。 脚本将继续在断开连接的会话中运行。

$parameters = @{
  ComputerName = (Get-Content -Path C:\Test\Servers.txt)
  InDisconnectedSession = $true
  FilePath = "\\Scripts\Public\ConfigInventory.ps1"
  SessionOption = @{OutputBufferingMode="Drop";IdleTimeout=43200000}
}
Invoke-Command @parameters

该命令使用 Invoke-Command 来运行脚本。 ComputerName 参数的值是一个 Get-Content 命令,用于从文本文件中获取远程计算机的名称。 InDisconnectedSession 参数在启动命令后立即断开会话的连接。 FilePath 参数的值是 Invoke-Command 在每个计算机上运行的脚本。

SessionOption 的值是哈希表。 OutputBufferingMode 值设置为 DropIdleTimeout 值设置为 43200000 毫秒(12 小时)。

若要获取在断开连接的会话中运行的命令和脚本的结果,请使用 Receive-PSSession cmdlet。

示例 19:使用 SSH 在远程计算机上运行命令

此示例演示如何使用安全外壳(SSH)在远程计算机上运行命令。 如果在远程计算机上配置 SSH 以提示输入密码,则会收到密码提示。 否则,必须使用基于 SSH 密钥的用户身份验证。

Invoke-Command -HostName UserA@LinuxServer01 -ScriptBlock { Get-MailBox * }

示例 20:使用 SSH 在远程计算机上运行命令并指定用户身份验证密钥

此示例演示如何使用 SSH 在远程计算机上运行命令,以及如何指定用于用户身份验证的密钥文件。 除非密钥身份验证失败,并且远程计算机配置为允许基本密码身份验证,否则不会提示输入密码。

Invoke-Command -HostName UserA@LinuxServer01 -ScriptBlock { Get-MailBox * } -KeyFilePath /UserA/UserAKey_rsa

示例 21:使用 SSH 作为作业在多个远程计算机上运行脚本文件

此示例演示如何使用 SSH 和 SSHConnection 参数集在多个远程计算机上运行脚本文件。 SSHConnection 参数采用包含每台计算机连接信息的哈希表数组。 此示例要求目标远程计算机配置 SSH 以支持基于密钥的用户身份验证。

$sshConnections =
@{ HostName="WinServer1"; UserName="Domain\UserA"; KeyFilePath="C:\Users\UserA\id_rsa" },
@{ HostName="UserB@LinuxServer5"; KeyFilePath="/Users/UserB/id_rsa" }
$results = Invoke-Command -FilePath c:\Scripts\CollectEvents.ps1 -SSHConnection $sshConnections

参数

-AllowRedirection

允许将此连接重定向到备用统一资源标识符(URI)。

使用 ConnectionURI 参数时,远程目标可以返回重定向到其他 URI 的说明。 默认情况下,PowerShell 不会重定向连接,但可以使用此参数来允许它重定向连接。

还可以通过更改 MaximumConnectionRedirectionCount 会话选项值来限制连接重定向的次数。 使用 New-PSSessionOption cmdlet 的 MaximumRedirection 参数,或设置 $PSSessionOption 首选项变量的 MaximumConnectionRedirectionCount 属性。 默认值为 5。

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-ApplicationName

指定连接 URI 的应用程序名称段。 如果不在命令中使用 ConnectionURI 参数,请使用此参数指定应用程序名称。

默认值是本地计算机上的 $PSSessionApplicationName 首选项变量的值。 如果未定义此首选项变量,则默认值为 WSMAN。 此值适用于大多数用途。 有关详细信息,请参阅 about_Preference_Variables

WinRM 服务使用应用程序名称来选择侦听器来为连接请求提供服务。 此参数的值应与远程计算机上的侦听器的 URLPrefix 属性的值匹配。

类型:String
Position:Named
默认值:$PSSessionApplicationName if set on the local computer, otherwise WSMAN
必需:False
接受管道输入:True
接受通配符:False

-ArgumentList

提供 scriptblock 的参数值。 脚本块中的参数通过提供给 ArgumentList的数组值的位置传递。 这称为数组散点。 有关 ArgumentList的行为的详细信息,请参阅 about_Splatting

类型:Object[]
别名:Args
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-AsJob

指示此 cmdlet 在远程计算机上以后台作业的形式运行命令。 使用此参数可以运行需要大量时间才能完成的命令。

使用 AsJob 参数时,该命令将返回一个表示作业的对象,然后显示命令提示符。 作业完成后,可以继续在会话中工作。 若要管理作业,请使用 *-Job cmdlet。 若要获取作业结果,请使用 Receive-Job cmdlet。

AsJob 参数类似于使用 Invoke-Command cmdlet 远程运行 Start-Job cmdlet。 但是,使用 AsJob,即使作业在本地计算机上运行,也会在本地计算机上创建该作业。 远程作业的结果会自动返回到本地计算机。

有关 PowerShell 后台作业的详细信息,请参阅 about_Jobsabout_Remote_Jobs

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-Authentication

指定用于对用户凭据进行身份验证的机制。 CredSSP 身份验证仅适用于 Windows Vista、Windows Server 2008 和更高版本的 Windows 操作系统。

此参数的可接受值如下所示:

  • 违约
  • 基本
  • Credssp
  • 消化
  • Kerberos
  • 谈判
  • NegotiateWithImplicitCredential

默认值为 Default。

有关此参数的值的详细信息,请参阅 AuthenticationMechanism 枚举

谨慎

凭据安全支持提供程序(CredSSP)身份验证(其中用户凭据传递到要进行身份验证的远程计算机)旨在用于需要对多个资源进行身份验证的命令,例如访问远程网络共享。 此机制会增加远程操作的安全风险。 如果远程计算机遭到入侵,则传递给它的凭据可用于控制网络会话。 有关详细信息,请参阅 凭据安全支持提供程序

类型:AuthenticationMechanism
接受的值:Basic, Default, Credssp, Digest, Kerberos, Negotiate, NegotiateWithImplicitCredential
Position:Named
默认值:Default
必需:False
接受管道输入:False
接受通配符:False

-CertificateThumbprint

指定有权连接到断开连接会话的用户帐户的数字公钥证书(X509)。 输入证书的证书指纹。

证书用于基于客户端证书的身份验证。 它们只能映射到本地用户帐户,它们不适用于域帐户。

若要获取证书指纹,请使用 PowerShell 证书:驱动器中的 Get-ItemGet-ChildItem 命令。

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-ComputerName

指定运行命令的计算机。 默认值为本地计算机。

使用 ComputerName 参数时,PowerShell 会创建一个临时连接,该连接仅用于运行指定的命令,然后关闭。 如果需要持久连接,请使用 Session 参数。

在逗号分隔的列表中,键入一个或多个计算机的 NETBIOS 名称、IP 地址或完全限定的域名。 若要指定本地计算机,请键入计算机名称、localhost 或点(.)。

若要在 ComputerName的值中使用 IP 地址,该命令必须包含 Credential 参数。 必须为 HTTPS 传输配置计算机,或者远程计算机的 IP 地址必须包含在本地计算机的 WinRM TrustedHosts 列表中。 有关将计算机名称添加到 TrustedHosts 列表的说明,请参阅 如何将计算机添加到受信任的主机列表

在 Windows Vista 和更高版本的 Windows 操作系统上,若要将本地计算机包含在 ComputerName的值中,必须使用 以管理员身份运行 PowerShell 选项。

类型:String[]
别名:Cn
Position:0
默认值:Local computer
必需:False
接受管道输入:False
接受通配符:False

-ConfigurationName

指定用于新 PSSession的会话配置。

输入会话配置的配置名称或完全限定的资源 URI。 如果仅指定配置名称,则前面有以下架构 URI:http://schemas.microsoft.com/PowerShell

与 SSH 一起使用时,此参数指定要在目标上使用的子系统,如 sshd_config中定义。 SSH 的默认值为 powershell 子系统。

会话的会话配置位于远程计算机上。 如果远程计算机上不存在指定的会话配置,该命令将失败。

默认值是本地计算机上的 $PSSessionConfigurationName 首选项变量的值。 如果未设置此首选项变量,则默认值为 Microsoft.PowerShell。 有关详细信息,请参阅 about_Preference_Variables

类型:String
Position:Named
默认值:$PSSessionConfigurationName if set on the local computer, otherwise Microsoft.PowerShell
必需:False
接受管道输入:True
接受通配符:False

-ConnectionUri

指定定义会话连接终结点的统一资源标识符(URI)。 URI 必须完全限定。

此字符串的格式如下所示:

<Transport>://<ComputerName>:<Port>/<ApplicationName>

默认值如下所示:

http://localhost:5985/WSMAN

如果未指定连接 URI,可以使用 UseSSL端口 参数来指定连接 URI 值。

URI 传输 段的有效值为 HTTP 和 HTTPS。 如果使用传输段指定连接 URI,但不指定端口,则会使用标准端口创建会话:80 表示 HTTP,443 用于 HTTPS。 若要使用 PowerShell 远程处理的默认端口,请为 HTTP 指定端口 5985,或为 HTTPS 指定端口 5986。

如果目标计算机将连接重定向到其他 URI,则 PowerShell 会阻止重定向,除非在命令中使用 AllowRedirection 参数。

类型:Uri[]
别名:URI, CU
Position:0
默认值:http://localhost:5985/WSMAN
必需:False
接受管道输入:False
接受通配符:False

-ContainerId

指定容器 ID 的数组。

类型:String[]
Position:Named
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-Credential

指定有权执行此操作的用户帐户。 默认值为当前用户。

键入用户名(如 User01Domain01\User01),或输入由 Get-Credential cmdlet 生成的 PSCredential 对象。 如果键入用户名,系统会提示输入密码。

凭据存储在 PSCredential 对象中,密码存储为 SecureString

注意

有关 SecureString 数据保护的详细信息,请参阅 SecureString 的安全性如何?

类型:PSCredential
Position:Named
默认值:Current user
必需:False
接受管道输入:True
接受通配符:False

-EnableNetworkAccess

指示此 cmdlet 向环回会话添加交互式安全令牌。 交互式令牌允许在环回会话中运行命令,以便从其他计算机获取数据。 例如,可以在会话中运行将 XML 文件从远程计算机复制到本地计算机的命令。

环回会话是在同一台计算机上发起和结束的 PSSession。 若要创建环回会话,请省略 ComputerName 参数,或将其值设置为 dot(.)、localhost 或本地计算机的名称。

默认情况下,环回会话是使用网络令牌创建的,该令牌可能无法提供对远程计算机进行身份验证的足够权限。

EnableNetworkAccess 参数仅在环回会话中有效。 如果在远程计算机上创建会话时使用 EnableNetworkAccess,则命令会成功,但参数将被忽略。

可以使用 CredSSPAuthentication 参数的值(该参数将会话凭据委托给其他计算机)在环回会话中允许远程访问。

为了防止计算机受到恶意访问,具有交互式令牌的断开连接环回会话(即使用 EnableNetworkAccess创建的会话)只能从创建会话的计算机重新连接。 可以使用 CredSSP 身份验证的断开连接会话可以从其他计算机重新连接。 有关详细信息,请参阅 Disconnect-PSSession

此参数是在 PowerShell 3.0 中引入的。

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-FilePath

指定此 cmdlet 在一个或多个远程计算机上运行的本地脚本。 输入脚本的路径和文件名,或通过管道将脚本路径传递给 Invoke-Command。 脚本必须存在于本地计算机或本地计算机可以访问的目录中。 使用 ArgumentList 指定脚本中的参数值。

使用此参数时,PowerShell 会将指定脚本文件的内容转换为脚本块,将脚本块传输到远程计算机,并在远程计算机上运行它。

类型:String
别名:PSPath
Position:1
默认值:None
必需:True
接受管道输入:False
接受通配符:False

-HideComputerName

指示此 cmdlet 从输出显示中省略每个对象的计算机名称。 默认情况下,生成对象的计算机的名称将显示在显示中。

此参数仅影响输出显示。 它不会更改对象。

类型:SwitchParameter
别名:HCN
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-HostName

为基于安全外壳(SSH)的连接指定计算机名称数组。 这类似于 ComputerName 参数,但与远程计算机的连接是使用 SSH 而不是 Windows WinRM 进行的。

此参数是在 PowerShell 6.0 中引入的。

类型:String[]
Position:Named
默认值:None
必需:True
接受管道输入:False
接受通配符:False

-InDisconnectedSession

指示此 cmdlet 在断开连接的会话中运行命令或脚本。

使用 InDisconnectedSession 参数时,Invoke-Command 在每个远程计算机上创建持久会话,启动由 ScriptBlockFilePath 参数指定的命令,然后断开与会话的连接。 这些命令将继续在断开连接的会话中运行。 InDisconnectedSession 使你可以运行命令,而无需维护与远程会话的连接。 而且,由于会话在返回任何结果之前断开连接,因此 InDisconnectedSession 确保所有命令结果都返回到重新连接的会话,而不是在会话之间拆分。

不能将 InDisconnectedSessionSession 参数或 AsJob 参数一起使用。

使用 InDisconnectedSession 的命令返回表示断开连接会话的 PSSession 对象。 它们不返回命令输出。 若要连接到断开连接的会话,请使用 Connect-PSSessionReceive-PSSession cmdlet。 若要获取会话中运行的命令的结果,请使用 Receive-PSSession cmdlet。 若要运行在断开连接的会话中生成输出的命令,请将 OutputBufferingMode 会话选项的值设置为 Drop。 如果打算连接到断开连接的会话,请设置会话中的空闲超时,以便在删除会话之前提供足够的时间进行连接。

可以在 SessionOption 参数或 $PSSessionOption 首选项变量中设置输出缓冲模式和空闲超时。 有关会话选项的详细信息,请参阅 New-PSSessionOptionabout_Preference_Variables

有关断开连接会话功能的详细信息,请参阅 about_Remote_Disconnected_Sessions

此参数是在 PowerShell 3.0 中引入的。

类型:SwitchParameter
别名:Disconnected
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-InputObject

指定命令的输入。 输入包含对象或键入获取对象的命令或表达式的变量。

使用 InputObject 参数时,请使用 ScriptBlock 参数的值中的 $Input 自动变量来表示输入对象。

类型:PSObject
Position:Named
默认值:None
必需:False
接受管道输入:True
接受通配符:False

-JobName

指定后台作业的友好名称。 默认情况下,作业命名为 Job<n>,其中 <n> 为序号。

如果在命令中使用 JobName 参数,该命令将作为作业运行,并且 Invoke-Command 返回作业对象,即使命令中不包含 AsJob 也是如此。

有关 PowerShell 后台作业的详细信息,请参阅 about_Jobs

类型:String
Position:Named
默认值:Job<n>
必需:False
接受管道输入:False
接受通配符:False

-KeyFilePath

指定安全外壳(SSH)用于对远程计算机上的用户进行身份验证的密钥文件路径。

SSH 允许通过私钥和公钥执行用户身份验证,作为基本密码身份验证的替代方法。 如果远程计算机配置为进行密钥身份验证,则此参数可用于提供标识用户的密钥。

此参数是在 PowerShell 6.0 中引入的。

类型:String
别名:IdentityFilePath
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-NoNewScope

指示此 cmdlet 在当前范围内运行指定的命令。 默认情况下,Invoke-Command 在其自己的范围内运行命令。

此参数仅在当前会话中运行的命令有效,即省略 ComputerNameSession 参数的命令。

此参数是在 PowerShell 3.0 中引入的。

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-Port

指定用于此命令的远程计算机上的网络端口。 若要连接到远程计算机,远程计算机必须侦听连接使用的端口。 默认端口为 5985(用于 HTTP 的 WinRM 端口)和 5986(用于 HTTPS 的 WinRM 端口)。

在使用备用端口之前,请将远程计算机上的 WinRM 侦听器配置为侦听该端口。 若要配置侦听器,请在 PowerShell 提示符处键入以下两个命令:

Remove-Item -Path WSMan:\Localhost\listener\listener* -Recurse

New-Item -Path WSMan:\Localhost\listener -Transport http -Address * -Port \<port-number\>

除非必须,否则不要使用 Port 参数。 命令中设置的端口适用于运行命令的所有计算机或会话。 备用端口设置可能会阻止命令在所有计算机上运行。

类型:Int32
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-RemoteDebug

用于在远程 PowerShell 会话中的调试模式下运行调用的命令。

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-RunAsAdministrator

指示此 cmdlet 以管理员身份调用命令。

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-ScriptBlock

指定要运行的命令。 将命令括在大括号({ })中以创建脚本块。 使用 Invoke-Command 远程运行命令时,将在远程计算机上评估该命令中的任何变量。

注意

脚本块的参数只能按位置从 ArgumentList 传入。 切换参数不能按位置传递。 如果需要一个类似于 switchParameter 类型的 参数,请改用 布尔 类型。

类型:ScriptBlock
别名:Command
Position:0
默认值:None
必需:True
接受管道输入:False
接受通配符:False

-Session

指定运行此命令的会话数组。 输入一个变量,其中包含 PSSession 对象或创建或获取 PSSession 对象的命令,例如 New-PSSessionGet-PSSession 命令。

创建 PSSession时,PowerShell 将建立与远程计算机的持久连接。 使用 PSSession 运行一系列共享数据的相关命令。 若要运行单个命令或一系列不相关的命令,请使用 ComputerName 参数。 有关详细信息,请参阅 about_PSSessions

类型:PSSession[]
Position:0
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-SessionName

指定断开连接的会话的友好名称。 可以使用名称来引用后续命令中的会话,例如 Get-PSSession 命令。 此参数仅对 InDisconnectedSession 参数有效。

此参数是在 PowerShell 3.0 中引入的。

类型:String[]
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-SessionOption

指定会话的高级选项。 输入 SessionOption 对象,例如使用 New-PSSessionOption cmdlet 创建的会话选项,或键是会话选项名称和值是会话选项值的哈希表。

选项的默认值取决于 $PSSessionOption 首选项变量的值(如果已设置)。 否则,默认值由会话配置中设置的选项建立。

会话选项值优先于在 $PSSessionOption 首选项变量和会话配置中设置的会话的默认值。 但是,它们不优先于会话配置中设置的最大值、配额或限制。

有关包含默认值的会话选项的说明,请参阅 New-PSSessionOption。 有关 $PSSessionOption 首选项变量的信息,请参阅 about_Preference_Variables。 有关会话配置的详细信息,请参阅 about_Session_Configurations

类型:PSSessionOption
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-SSHConnection

此参数采用哈希表数组,其中每个哈希表包含建立安全外壳(SSH)连接所需的一个或多个连接参数。 SSHConnection 参数可用于创建多个会话,其中每个会话需要不同的连接信息。

哈希表具有以下成员:

  • ComputerName(或 HostName
  • 端口
  • UserName
  • KeyFilePath(或 IdentityFilePath

ComputerName(或 HostName)是唯一需要的键值对。

此参数是在 PowerShell 6.0 中引入的。

类型:Hashtable[]
Position:Named
默认值:None
必需:True
接受管道输入:False
接受通配符:False

-SSHTransport

指示使用安全外壳(SSH)建立远程连接。

默认情况下,PowerShell 使用 Windows WinRM 连接到远程计算机。 此开关强制 PowerShell 使用 HostName 参数建立基于 SSH 的远程连接。

此参数是在 PowerShell 6.0 中引入的。

类型:SwitchParameter
接受的值:true
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-Subsystem

指定用于新 PSSession的 SSH 子系统。

这指定在目标上使用的子系统,如sshd_config中定义。 子系统使用预定义的参数启动特定版本的 PowerShell。 如果远程计算机上不存在指定的子系统,该命令将失败。

如果未使用此参数,则默认值为“powershell”子系统。

类型:String
Position:Named
默认值:powershell
必需:False
接受管道输入:True
接受通配符:False

-ThrottleLimit

指定可建立以运行此命令的最大并发连接数。 如果省略此参数或输入值 0,则使用默认值 32。

限制限制仅适用于当前命令,不适用于会话或计算机。

类型:Int32
Position:Named
默认值:32
必需:False
接受管道输入:False
接受通配符:False

-UserName

指定用于在远程计算机上运行命令的帐户的用户名。 用户身份验证方法取决于在远程计算机上配置安全外壳 (SSH) 的方式。

如果 SSH 配置为基本密码身份验证,系统会提示输入用户密码。

如果 SSH 配置为基于密钥的用户身份验证,则可以通过 KeyFilePath 参数提供密钥文件路径,并且不会发生密码提示。 如果客户端用户密钥文件位于 SSH 已知位置,则基于密钥的身份验证不需要 KeyFilePath 参数,并且用户身份验证会自动根据用户名进行。 有关详细信息,请参阅平台的 SSH 文档,了解基于密钥的用户身份验证。

这不是必需的参数。 如果未指定 UserName 参数,则当前登录的用户名用于连接。

此参数是在 PowerShell 6.0 中引入的。

类型:String
Position:Named
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-UseSSL

指示此 cmdlet 使用安全套接字层 (SSL) 协议建立与远程计算机的连接。 默认情况下,不使用 SSL。

WS-Management 加密通过网络传输的所有 PowerShell 内容。 UseSSL 参数是一种额外的保护,用于跨 HTTPS(而不是 HTTP)发送数据。

如果使用此参数,但 SSL 在用于命令的端口上不可用,命令将失败。

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-VMId

指定虚拟机的 ID 数组。

类型:Guid[]
别名:VMGuid
Position:0
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-VMName

指定虚拟机的名称数组。

类型:String[]
Position:Named
默认值:None
必需:True
接受管道输入:True
接受通配符:False

输入

ScriptBlock

可以在脚本块中通过管道将命令传递给 Invoke-Command。 使用 $Input 自动变量来表示命令中的输入对象。

输出

System.Management.Automation.PSRemotingJob, System.Management.Automation.Runspaces.PSSession, or the output of the invoked command

如果使用 AsJob 参数,则此 cmdlet 将返回作业对象。 如果指定 InDisconnectedSession 参数,Invoke-Command 返回 PSSession 对象。 否则,它将返回已调用命令的输出,该命令是 ScriptBlock 参数的值。

备注

在 Windows Vista 和更高版本的 Windows 操作系统上,若要使用 Invoke-CommandComputerName 参数在本地计算机上运行命令,必须使用 以管理员身份运行 PowerShell 选项。

在多台计算机上运行命令时,PowerShell 会按照它们在列表中显示的顺序连接到计算机。 但是,命令输出按从远程计算机接收的顺序显示,这可能有所不同。

命令结果中包含 Invoke-Command 运行的命令导致的错误。 本地命令中将终止错误的错误视为远程命令中的非终止错误。 此策略可确保在一台计算机上终止错误不会关闭其运行的所有计算机上的命令。 即使远程命令在单个计算机上运行,也使用此做法。

如果远程计算机不在本地计算机信任的域中,则计算机可能无法对用户的凭据进行身份验证。 若要将远程计算机添加到 WS-Management 中受信任的主机列表,请在 WSMAN 提供程序中使用以下命令,其中 <Remote-Computer-Name> 是远程计算机的名称:

Set-Item -Path WSMan:\Localhost\Client\TrustedHosts -Value \<Remote-Computer-Name\>

使用 InDisconnectedSession 参数断开连接 PSSession 时,会话状态 断开连接,可用性 State 属性的值相对于当前会话。 断开连接 值表示 PSSession 未连接到当前会话。 但是,这并不意味着 PSSession 已与所有会话断开连接。 它可能连接到其他会话。 若要确定是否可以连接或重新连接到会话,请使用 Availability 属性。

可用性None 指示可以连接到会话。 忙碌 的值指示无法连接到 PSSession,因为它已连接到另一个会话。 有关会话的 State 属性的值的详细信息,请参阅 RunspaceState。 有关会话 可用性 属性的值的详细信息,请参阅 RunspaceAvailability

从 PowerShell 6.0 开始,包括 HostNameSSHConnection 参数。 添加了它们以提供基于安全外壳(SSH)的 PowerShell 远程处理。 在多个平台(Windows、Linux、macOS)和 PowerShell 远程处理中支持 PowerShell 和 SSH,这些平台支持 PowerShell 和 SSH。 这与以前的 Windows 仅基于 WinRM 的远程处理不同,许多特定于 WinRM 的功能和限制不适用。 例如,目前不支持基于 WinRM 的配额、会话选项、自定义终结点配置和断开连接/重新连接功能。 有关如何设置 PowerShell SSH 远程处理的详细信息,请参阅 PowerShell 远程处理 Over SSH