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-CommandPSSession 中运行该命令。 若要在断开连接的会话中运行命令,请使用 InDisconnectedSession 参数。 若要在后台作业中运行命令,请使用 AsJob 参数。

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

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

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

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

示例

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

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

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 在 Get-Culture Server02 上运行命令。 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

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

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

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

New-PSSession cmdlet 在计算机 Server02 上创建持久会话,并将会话保存在变量中 $sInvoke-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 存储在 $command S1 和 S2 远程计算机上的命令。

示例 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 范围修饰符标识远程命令中的局部变量。 默认情况下,假定所有变量均已在远程会话中定义。 作用域 Using 修饰符是在 PowerShell 3.0 中引入的。 有关范围修饰符的详细信息 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 Get-WinEvent 在 Server01 上运行,从事件日志中获取十个最新事件。 LogName 参数的值是$Log作用域修饰符前缀Using的变量,指示它是在本地会话中创建的,而不是在远程会话中创建的。

示例 10:隐藏计算机名称

此示例显示使用 HideComputerName 参数 Invoke-Command的效果。 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 关键字

关键字 ParamArgumentList 参数用于将变量值传递给脚本块中的命名参数。 此示例显示以字母 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 以及 $param2. Get-ChildItem使用命名参数、名称和包含变量名称。 ArgumentList 将值传递给变量。

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

自动 $args 变量和 ArgumentList 参数用于将数组值传递给脚本块中的参数位置。 此示例显示服务器的文件目录内容 .txtGet-ChildItemPath 参数为位置 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数组值传递给 Get-ChildItemPathFilter 的参数位置。

示例 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

第一行使用 cmdlet 在 Get-Credential 变量中 $LiveCred 存储 Windows Live ID 凭据。 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 创建保存在变量中的 $maxPSSessionOption 对象。 该命令使用 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) 委派在本地计算机上的客户端设置和远程计算机上的服务设置中启用。 若要运行此示例中的命令,你必须是本地计算机和远程计算机上的 Administrators 组的成员。

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 网络共享获取脚本。 该命令使用具有 CredSSP 值的 Authentication 参数和值为 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 在远程计算机上运行命令

此示例演示如何使用 Secure Shell (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 会话选项值,限制重定向连接的次数。 使用 cmdlet 的 MaximumRedirection 参数或设置首选项变量的 New-PSSessionOption$PSSessionOptionMaximumConnectionRedirectionCount 属性。 默认值为 5。

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

-ApplicationName

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

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

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

Type:String
Position:Named
Default value:$PSSessionApplicationName if set on the local computer, otherwise WSMAN
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-ArgumentList

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

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

-AsJob

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

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

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

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

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

-Authentication

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

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

  • 默认
  • 基本
  • Credssp
  • 摘要
  • Kerberos
  • Negotiate
  • NegotiateWithImplicitCredential

默认值为 Default。

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

注意

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

Type:AuthenticationMechanism
Accepted values:Basic, Default, Credssp, Digest, Kerberos, Negotiate, NegotiateWithImplicitCredential
Position:Named
Default value:Default
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-CertificateThumbprint

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

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

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

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

-ComputerName

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

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

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

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

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

Type:String[]
Aliases:Cn
Position:0
Default value:Local computer
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ConfigurationName

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

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

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

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

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

Type:String
Position:Named
Default value:$PSSessionConfigurationName if set on the local computer, otherwise Microsoft.PowerShell
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-ConnectionUri

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

此字符串的格式如下:

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

默认值如下:

http://localhost:5985/WSMAN

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

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

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

Type:Uri[]
Aliases:URI, CU
Position:0
Default value:http://localhost:5985/WSMAN
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ContainerId

指定容器 ID 的数组。

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

-Credential

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

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

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

注意

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

Type:PSCredential
Position:Named
Default value:Current user
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-EnableNetworkAccess

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

环回会话是在同一计算机上开始并终止的 PSSession。 若要创建环回会话,请省略 ComputerName 参数或将其值设置为点 () . 、localhost 或本地计算机的名称。

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

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

可以使用身份验证参数的 CredSSP 值在环回会话中允许远程访问,该值将会话凭据委托给其他计算机。

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

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

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

-FilePath

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

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

Type:String
Aliases:PSPath
Position:1
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-HideComputerName

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

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

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

-HostName

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

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

Type:String[]
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters: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 中引入的。

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

-InputObject

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

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

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

-JobName

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

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

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

Type:String
Position:Named
Default value:Job<n>
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-KeyFilePath

指定 Secure Shell (SSH) 用来对远程计算机上的用户进行身份验证的密钥文件路径。

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

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

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

-NoNewScope

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

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

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

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

-Port

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

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

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

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

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

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

-RemoteDebug

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

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

-RunAsAdministrator

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

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

-ScriptBlock

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

注意

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

Type:ScriptBlock
Aliases:Command
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Session

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

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

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

-SessionName

为断开连接的会话指定一个友好名称。 可以使用名称在后续命令(如 Get-PSSession 命令)中引用会话。 此参数只有在与 InDisconnectedSession 参数一起使用时才有效。

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

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

-SessionOption

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

选项的默认值由首选项变量的值 $PSSessionOption 确定(如果已设置)。 否则,通过在会话配置中设置的选项创建默认值。

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

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

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

-SSHConnection

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

哈希表具有以下成员:

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

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

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

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

-SSHTransport

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

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

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

Type:SwitchParameter
Accepted values:true
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Subsystem

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

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

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

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

-ThrottleLimit

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

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

Type:Int32
Position:Named
Default value:32
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-UserName

指定用于在远程计算机上运行命令的帐户的用户名。 用户身份验证方法取决于远程计算机上如何配置 Secure Shell (SSH) 。

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

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

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

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

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

-UseSSL

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

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

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

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

-VMId

指定虚拟机的 ID 数组。

Type:Guid[]
Aliases:VMGuid
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-VMName

指定一个虚拟机的名称数组。

Type:String[]
Position:Named
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters: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 操作系统上,若要使用 ComputerName 参数在本地 Invoke-Command 计算机上运行命令,必须使用 “以管理员身份运行” 选项运行 PowerShell。

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

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

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

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

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

AvailabilityNone 值指示可连接到 PSSession。 “忙碌”值表示无法连接到 PSSession,因为它已连接到另一个会话。 有关会话 状态 属性的值的详细信息,请参阅 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