在本地和远程计算机上运行命令。
语法
Invoke-Command [-ScriptBlock] <scriptblock> [[-ComputerName] <string[]>] [-ApplicationName <string>] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-CertificateThumbprint <string>] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-Port <int>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-UseSSL] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>] Invoke-Command [-FilePath] <string> [[-ComputerName] <string[]>] [-ApplicationName <string>] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-Port <int>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-UseSSL] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>] Invoke-Command [-FilePath] <string> [[-Session] <PSSession[]>] [-AsJob] [-HideComputerName] [-JobName <string>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>] Invoke-Command [-FilePath] <string> [[-ConnectionURI] <Uri[]>] [-AllowRedirection] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>] Invoke-Command [-ScriptBlock] <scriptblock> [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>] Invoke-Command [-ScriptBlock] <scriptblock> [[-Session] <PSSession[]>] [-AsJob] [-HideComputerName] [-JobName <string>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>] Invoke-Command [-ScriptBlock] <scriptblock> [[-ConnectionURI] <Uri[]>] [-AllowRedirection] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-CertificateThumbprint <string>] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]
说明
Invoke-Command cmdlet 在本地或远程计算机上运行命令,并从命令返回所有输出,包括错误。使用一个 Invoke-Command 命令,可以在多台计算机上运行命令。
若要在一台远程计算机上运行一个命令,请使用 ComputerName 参数。若要运行一系列共享数据的相关命令,请在远程计算机上创建一个 PSSession(持续性连接),然后使用 Invoke-Command 的 Session 参数在 PSSession 中运行命令。
还可以在本地计算机上使用 Invoke-Command 将脚本块中的字符串作为命令来评估或运行。Windows PowerShell 将脚本块转换为命令,并立即在当前作用域内运行此命令,而不是仅仅在命令行中回显该字符串。
使用 Invoke-Command 在远程计算机上运行命令之前,请阅读 about_Remote。
参数
-AllowRedirection
允许将此连接重定向到备用 URI。
使用 ConnectionURI 参数时,远程目标可以返回重定向到另一 URI 的指令。默认情况下,Windows PowerShell 不会重定向连接,但您可以使用 AllowRedirection 参数允许它重定向连接。
也可以通过设置 $PSSessionOption 首选项变量的 MaximumConnectionRedirectionCount 属性或 SessionOption 参数值的 MaximumConnectionRedirectionCount 属性来限制重定向连接的次数。默认值为 5。有关详细信息,请参阅 SessionOption 参数的说明以及 New-PSSessionOption cmdlet 的帮助主题。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-ApplicationName <string>
指定连接 URI 的应用程序名称段。使用此参数可在命令中未使用 ConnectionURI 参数时指定应用程序名称。
默认值为本地计算机上的 $PSSessionApplicationName 首选项变量的值。如果未定义此首选项变量,则默认值为 WSMAN。该值适用于大多数使用情况。有关详细信息,请参阅 about_Preference_Variables。
WinRM 服务使用该应用程序名称来选择为连接请求提供服务的侦听器。此参数的值应与远程计算机上的侦听器的 URLPrefix 属性值匹配。
是否为必需? |
false |
位置? |
named |
默认值 |
WSMAN |
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-ArgumentList <Object[]>
提供命令中的局部变量的值。在远程计算机上运行此命令之前,将用这些值替换此命令中的变量。以逗号分隔的列表形式输入值。值按列出顺序与变量关联。ArgumentList 的别名为“Args”。
ArgumentList 中的值可以是实际值(如“1024”),也可以是对局部变量的引用(如“$max”)。
要在命令中使用局部变量,请使用如下命令格式:
{param($<name1>[, $<name2>]...)<command-with-local-variables>} -ArgumentList <value | $local-variable>
“param”关键字列出命令中使用的局部变量。ArgumentList 参数按变量列出的顺序提供变量的值。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-AsJob
在远程计算机上将命令作为后台作业运行。使用此参数可运行需要较长时间才能完成的命令。
使用 AsJob 时,此命令返回代表作业的对象,然后显示命令提示符。当作业完成时,您可以继续在此会话中工作。要管理作业,请使用 Job cmdlet。要获取作业结果,请使用 Receive-Job。
AsJob 参数类似于使用 Invoke-Command 远程运行 Start-Job 命令。但是,对于 AsJob,作业是在本地计算机上创建的,即使作业运行在远程计算机上也是如此,而且远程作业的结果会自动返回本地计算机。
有关 Windows PowerShell 后台作业的详细信息,请参阅 about_Jobs 和 about_Remote_Jobs。
是否为必需? |
false |
位置? |
named |
默认值 |
无 |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-Authentication <AuthenticationMechanism>
指定用于对用户的凭据进行身份验证的机制。有效值为 Default、Basic、Credssp、Digest、Kerberos、Negotiate 和 NegotiateWithImplicitCredential。默认值为 Default。
CredSSP 身份验证仅在 Windows Vista、Windows Server 2008 和更高版本的 Windows 中可用。
有关该参数的值的信息,请参阅 MSDN 中 System.Management.Automation.Runspaces.AuthenticationMechanism 枚举的说明。
注意:在凭据安全服务提供程序 (CredSSP) 身份验证中,用户凭据传递到远程计算机中以进行验证,这种验证用于要求对多个资源(例如访问远程网络共享)进行验证的命令。此机制增加了远程操作的安全风险。如果远程计算机的安全受到威胁,则传递给该计算机的凭据可用于控制网络会话。
是否为必需? |
false |
位置? |
named |
默认值 |
Default |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-CertificateThumbprint <string>
指定有权执行此操作的用户帐户的数字公钥证书 (X509)。输入证书的证书指纹。
证书用于基于客户端证书的身份验证。它们只能映射到本地用户帐户,而不适用于域帐户。
若要获取证书指纹,请在 Windows PowerShell Cert: 驱动器中使用 Get-Item 或 Get-ChildItem 命令。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-ComputerName <string[]>
指定运行此命令的计算机。默认值为本地计算机。
使用 ComputerName 参数时,Windows PowerShell 会创建一个临时连接,此连接仅用于运行指定的命令,之后将关闭。如果需要持续性连接,请使用 Session 参数。
在一个逗号分隔列表中键入一台或多台计算机的 NETBIOS 名称、IP 地址或完全限定的域名。要指定本地计算机,请键入计算机名称、“localhost”或句点 (.)。
若要在 ComputerName 参数的值中使用 IP 地址,命令必须包括 Credential 参数。另外,必须为计算机配置 HTTPS 传输,或者必须在本地计算机上的 WinRM TrustedHosts 列表中包含远程计算机的 IP 地址。有关将计算机名称添加到 TrustedHosts 列表的说明,请参阅 about_Remote_Troubleshooting 中的“如何将计算机添加到受信任主机列表中”。
注意:在 Windows Vista 以及更高版本的 Windows 上,要在 ComputerName 参数的值中包括本地计算机,必须使用“以管理员身份运行”选项打开 Windows PowerShell。
是否为必需? |
false |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-ConfigurationName <string>
指定用于新 PSSession 的会话配置。
输入会话配置的配置名称或完全限定的资源 URI。如果只指定配置名称,那么将在该名称前面添加以下架构 URI:https://schemas.microsoft.com/powershell。
会话的会话配置位于远程计算机上。如果远程计算机上不存在指定的会话配置,命令会失败。
默认值为本地计算机上的 $PSSessionConfigurationName 首选项变量的值。如果未设置此首选项变量,则默认为 Microsoft.PowerShell。有关详细信息,请参阅 about_preference_variables。
是否为必需? |
false |
位置? |
named |
默认值 |
https://schemas.Microsoft.com/PowerShell/Microsoft.PowerShell |
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-ConnectionURI <Uri[]>
指定定义连接终结点的统一资源标识符 (URI)。URI 必须完全限定。
此字符串的格式为:
<Transport>://<ComputerName>:<Port>/<ApplicationName>
默认值为:
http://localhost:80/WSMAN
URI 的 Transport 段的有效值为 HTTP 和 HTTPS。如果未指定 ConnectionURI,则可以使用 UseSSL、ComputerName、Port 和 ApplicationName 参数指定 URI 值。
如果目标计算机将连接重定向到另一个 URI,Windows PowerShell 将阻止重定向,除非您在命令中使用了 AllowRedirection 参数。
是否为必需? |
false |
位置? |
1 |
默认值 |
http://localhost:80/wsman |
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-Credential <PSCredential>
指定有权执行此操作的用户帐户。默认值为当前用户。
键入用户名(如“User01”或“Domain01\User01”),或输入包含 PSCredential 对象(如 Get-Credential cmdlet 生成的一个 PSCredential 对象)的变量。键入用户名时,将会提示您键入密码。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-FilePath <string>
在一台或多台远程计算机上运行指定的本地脚本。输入脚本的路径和文件名,或通过管道将脚本路径传递给 Invoke-Command。脚本必须位于本地计算机上或者本地计算机能够访问的目录中。使用 ArgumentList 参数指定脚本中的参数的值。
使用此参数时,Windows PowerShell 将指定脚本文件的内容转换为脚本块,并将此脚本块传输到远程计算机,然后在该远程计算机上运行此脚本块。
是否为必需? |
true |
位置? |
2 |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-HideComputerName
在输出显示中省略每个对象的计算机名。默认情况下,显示内容中包括生成该对象的计算机的名称。
此参数仅影响输出显示。它不更改对象。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-InputObject <psobject>
指定命令的输入。请输入包含对象的变量,或者键入可获取对象的命令或表达式。
当使用 InputObject 时,在 ScriptBlock 参数的值中使用 $input 自动变量可表示输入对象。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
true (ByValue) |
是否接受通配符? |
false |
-JobName <string>
为后台作业指定一个友好名称。默认情况下,作业命名为“Job<n>”,其中 <n> 是一个序数。此参数只有在与 AsJob 参数一起使用时才有效。
如果在命令中使用 JobName 参数,该命令将作为作业运行,并且 Invoke-Command 将返回作业对象,即使您没有在命令中包括 AsJob 参数也是如此。
有关 Windows PowerShell 后台作业的详细信息,请参阅 about_Jobs。
是否为必需? |
false |
位置? |
named |
默认值 |
Job<n> |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-Port <int>
指定远程计算机上用于此命令的网络端口。默认值为端口 80(HTTP 端口)。
使用备用端口之前,必须将远程计算机上的 WinRM 侦听器配置为侦听该端口。若要配置侦听器,请在 Windows PowerShell 提示符下键入以下两条命令:
remove-item -path wsman:\Localhost\listener\listener* -recurse
new-item -path wsman:\Localhost\listener -Transport http -Address * -port <port-number>
除非确有必要,否则不要使用 Port 参数。命令中设置的 Port 应用于运行该命令的所有计算机或会话。备用端口设置可能使该命令无法在所有计算机上运行。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-ScriptBlock <scriptblock>
指定要运行的命令。用大括号 ({ }) 括起命令以形成脚本块。此参数是必需的。
默认情况下,将在远程计算机上对命令中的所有变量求值。要在命令中包括局部变量,请使用 ArgumentList 参数。
是否为必需? |
true |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-Session <PSSession[]>
在指定的 Windows PowerShell 会话 (PSSession) 中运行此命令。输入包含 PSSessions 的变量或者用来创建或获取 PSSessions 的命令,如 New-PSSession 或 Get-PSSession 命令。
通过创建 PSSession,Windows PowerShell 可以建立与远程计算机的持续性连接。使用 PSSession 可以运行共享数据的一系列相关命令。若要运行单个命令或一系列不相关的命令,请使用 ComputerName 参数。
若要创建 PSSession,请使用 New-PSSession cmdlet。有关详细信息,请参阅 about_PSSessions。
是否为必需? |
false |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-SessionOption <PSSessionOption>
为会话设置高级选项。输入使用 New-PSSessionOption cmdlet 创建的 SessionOption 对象。
这些选项的默认值由 $PSSessionOption 首选项变量的值(如果设置了该变量)确定。否则,会话使用系统默认值。
有关会话选项(包括默认值)的说明,请参阅 New-PSSessionOption cmdlet 的帮助主题。有关 $PSSessionOption 首选项变量的信息,请参阅 about_Preference_Variables。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-ThrottleLimit <int>
指定为运行此命令可建立的并发连接的最大数目。如果省略此参数或输入 0 值,则使用默认值 32。
节流限制仅适用于当前命令,而不适用于会话或计算机。
是否为必需? |
false |
位置? |
named |
默认值 |
32 |
是否接受管道输入? |
false |
是否接受通配符? |
false |
-UseSSL
使用安全套接字层 (SSL) 协议来建立与远程计算机的连接。默认情况下,不使用 SSL。
WS-Management 加密通过网络传输的所有 Windows PowerShell 内容。UseSSL 是一种额外的保护措施,它通过 HTTPS(而不是 HTTP)发送数据。
如果使用此参数,但 SSL 在用于此命令的端口上不可用,命令将失败。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
<CommonParameters>
此 cmdlet 支持通用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_Commonparameters.
输入和输出
输入类型是指可通过管道传递给 cmdlet 的对象的类型。返回类型是指 Cmdlet 所返回对象的类型。
输入 |
System.Management.Automation.ScriptBlock 您可以将脚本块中的命令通过管道传送到 Invoke-Command。使用 $input 自动变量可表示命令中的输入对象。 |
输出 |
System.Management.Automation.PSRemotingJob or the output of the invoked command 使用 AsJob 参数时,Invoke-Command 会返回作业对象。在其他情况下,它返回所调用命令(ScriptBlock 参数的值)的输出。 |
说明
-- 在 Windows Vista 以及更高版本的 Windows 上,要使用 Invoke-Command 的 ComputerName 参数在本地计算机上运行命令,必须使用“以管理员身份运行”选项打开 Windows PowerShell。
-- 在多台计算机上运行命令时,Windows PowerShell 会按列表中显示的顺序连接到各台计算机。但是,显示命令输出的顺序是从远程计算机接收命令的顺序。这两个顺序可能不同。
-- 命令结果中包括 Invoke-Command 运行的命令的结果。属于本地命令中的终止错误的错误被视为远程命令中的非终止错误。此策略可以确保一台计算机上的终止错误不会在运行该命令的所有计算机上终止该命令。即使在一台计算机上运行远程命令,也使用这种做法。
-- 如果远程计算机不在本地计算机信任的域中,该计算机可能无法对用户凭据进行身份验证。若要将远程计算机添加到 WS-Management 中的“受信任的主机”列表中,请在 WSMAN 提供程序中使用以下命令,其中 <Remote-Computer-Name> 是远程计算机的名称:
set-item -path wsman:\Localhost\Client\TrustedHosts -value <Remote-Computer-Name>。
示例 1
C:\PS>invoke-command -filepath c:\scripts\test.ps1 -computerName Server01 Disks: C:, D:, E: Status: Warning, Normal, Normal 说明 ----------- 此命令在 Server01 计算机上运行 Test.ps1 脚本。 该命令使用 FilePath 参数指定位于本地计算机的脚本。该脚本在远程计算机上运行,而结果将返回到本地计算机。
示例 2
C:\PS>invoke-command -computername server01 -credential domain01\user01 -scriptblock {get-culture} 说明 ----------- 此命令在 Server01 远程计算机上运行 Get-Culture 命令。 它使用 ComputerName 参数指定计算机名,使用 Credential 参数在“Domain01\User01”(有权运行命令的用户)的安全上下文中运行命令。它使用 ScriptBlock 参数来指定要在远程计算机上运行的命令。 作为响应,Windows PowerShell 显示一个对话框,请求提供 User01 帐户的密码和身份验证方法。然后,在 Server01 计算机上运行该命令并返回结果。
示例 3
C:\PS>$s = new-pssession -computername server02 -credential domain01\user01 C:\PS> invoke-command -session $s -scriptblock {get-culture} 说明 ----------- 此示例在 Server02 远程计算机上的一个会话(持续性连接)中运行相同的“Get-Culture”命令。通常,仅当要在远程计算机上运行一系列命令时,才创建会话。 第一个命令使用 New-PSSession cmdlet 在 Server02 远程计算机上创建一个会话,然后,将该会话保存在 $s 变量中。 第二个命令使用 Invoke-Command cmdlet 在 Server02 上运行 Get-Culture 命令。它使用 Session 参数指定保存在 $s 变量中的会话。 作为响应,Windows PowerShell 在 Server02 计算机上的会话中运行此命令。
示例 4
C:\PS>invoke-command -computername Server02 -scriptblock {$p = get-process powershell} C:\PS> invoke-command -computername Server02 -scriptblock {$p.virtualmemorysize} C:\PS> C:\PS> $s = new-pssession -computername Server02 C:\PS> invoke-command -session $s -scriptblock {$p = get-process powershell} C:\PS> invoke-command -session $s -scriptblock {$p.virtualmemorysize} 17930240 说明 ----------- 此示例比较使用 Invoke-Command 的 ComputerName 和 Session 参数的效果。它说明如何使用一个会话来运行一系列共享相同数据的命令。 前两个命令使用 Invoke-Command 的 ComputerName 参数在 Server02 远程计算机上运行命令。第一个命令使用 Get-Process 命令获取远程计算机上的 PowerShell 进程,并将它保存在 $p 变量中。第二个命令获取 PowerShell 进程的 VirtualMemorySize 属性的值。 第一条命令执行成功。但第二条命令失败,因为当您使用 ComputerName 参数时,Windows PowerShell 创建一个用于运行该命令的连接。然后,当该命令完成后,Windows PowerShell 会关闭该连接。$p 变量是在一个连接中创建的,但在为第二个命令创建的连接中不存在。 解决此问题的方法是:在远程计算机上创建一个会话(持续性连接),然后在同一会话中运行这两个相关的命令。 第三个命令使用 New-PSSession cmdlet 在 Server02 计算机上创建一个会话,然后,将该会话保存在 $s 变量中。第四个和第五个命令重复在第一个集合中使用的一系列命令,但在本例中,Invoke-Command 命令使用 Session 参数在同一会话中运行这两个命令。 在本例中,由于两个命令在同一会话中运行,因此命令会成功,且 $p 值在 $s 会话中保持活动状态以供将来使用。
示例 5
C:\PS>$command = { get-eventlog -log "windows powershell" | where {$_.message -like "*certificate*"} } C:\PS> invoke-command -computername S1, S2 -scriptblock $command 说明 ----------- 此示例说明如何输入保存在局部变量中的命令。 整个命令保存在局部变量中时,可以将变量指定为 ScriptBlock 参数的值。您不必使用“param”关键字或 ArgumentList 变量来提交局部变量的值。 第一个命令将 Get-Eventlog 命令保存在 $command 变量中。此命令设置为脚本块格式。 第二个命令使用 Invoke-Command cmdlet 在 S1 和 S2 远程计算机上运行 $command 中的命令。
示例 6
C:\PS>invoke-command -computername server01, server02, TST-0143, localhost -configurationname MySession.PowerShell -scriptblock {get-eventlog "windows powershell"} 说明 ----------- 此示例演示如何使用 Invoke-Command cmdlet 在多台计算机上运行一个命令。 此命令使用 ComputerName 参数来指定计算机。计算机名在以逗号分隔的列表中提供。计算机列表包括表示本地计算机的“localhost”值。 该命令使用 ConfigurationName 参数来指定 Windows PowerShell 的替代会话配置,并使用 ScriptBlock 参数来指定命令。 在本例中,脚本块中的命令获取每台远程计算机上的 Windows PowerShell 事件日志中的事件。
示例 7
C:\PS>$version = invoke-command -computername (get-content machines.txt) -scriptblock {(get-host).version} 说明 ----------- 此命令获取在 200 台远程计算机上运行的 Windows PowerShell 主机的版本。 由于只运行一个命令,因此不必创建与每台计算机的持续性连接(会话),而是由此命令使用 ComputerName 参数来指定计算机。 此命令使用 Invoke-Command cmdlet 来运行 Get-Host 命令。它使用点表示法来获取 Windows PowerShell 主机的 Version 属性。 为了指定计算机,它使用 Get-Content cmdlet 来获取 Machine.txt 文件(计算机名称文件)的内容。 这些命令同步运行(一次一个)。这些命令完成时,来自所有计算机的命令输出保存在 $version 变量中。输出包括数据来源计算机的名称。
示例 8
C:\PS>$s = new-pssession -computername Server01, Server02 C:\PS> invoke-command -session $s -scriptblock {get-eventlog system} -AsJob Id Name State HasMoreData Location Command --- ---- ----- ----- ----------- -------- ------- 1 Job1 Running True Server01,Server02 get-eventlog system C:\PS> $j = Get-Job C:\PS> $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 : C:\PS> $results = $j | Receive-Job 说明 ----------- 这些命令在两台远程计算机上运行一个后台作业。因为 Invoke-Command 命令使用 AsJob 参数,所以这些命令在远程计算机上运行,但作业实际驻留在本地计算机中,并且结果也传送到本地计算机。 第一个命令使用 New-PSSession cmdlet 在 Server01 和 Server02 远程计算机上创建会话, 第二个命令使用 Invoke-Command cmdlet 在每个会话中运行后台作业。此命令使用 AsJob 参数将命令作为后台作业运行。该命令返回一个包含两个子作业对象的作业对象,每个子作业对象分别对应于在两台远程计算机上运行的每个作业。 第三个命令使用 Get-Job 命令将作业对象保存在 $j 变量中。 第四个命令使用管道运算符 (|) 将 $j 变量的值发送到 Format-List cmdlet,后者在列表中显示作业对象的所有属性。 第五个命令获取作业的结果。它将 $j 中的作业对象通过管道传送给 Receive-Job cmdlet,并将结果存储在 $results 变量中。
示例 9
C:\PS>$MWFO-LOg = Microsoft-Windows-Forwarding/Operational C:\PS> invoke-command -computername server01 -scriptblock {param($log, $num) get-eventlog -logname $log -newest $num} -ArgumentList $MWFO-log, 10 说明 ----------- 此示例说明如何在运行于远程计算机上的命令中包括局部变量的值。 第一个命令将 Microsoft-Windows-Forwarding/Operational 事件日志的名称保存在 $MWFO-Log 变量中。 第二个命令使用 Invoke-Command cmdlet 在 Server01 远程计算机上运行一个 Get-EventLog 命令,以获取 Server01 上的 Microsoft-Windows-Forwarding/Operational 事件日志中的 10 个最新事件。 此命令使用“param”关键字创建两个变量 $log 和 $num,这两个变量在 Get-EventLog 命令中用作占位符。这些占位符的名称是任意的,不需要匹配为其提供值的局部变量的名称。 ArgumentList 参数的值演示了指定参数列表中的值的两种不同方法。$log 占位符的值是在第一个命令中定义的 $MFWO-Log 变量。$num 变量的值为 10。 在命令发送到远程计算机之前,变量将替换为指定的值。
示例 10
C:\PS>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 C:\PS> 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 的 HideComputerName 参数的效果。 前两个命令使用 Invoke-Command cmdlet 对 PowerShell 进程运行 Get-Process 命令。第一个命令的输出包括 PsComputerName 属性,此属性包含运行该命令的计算机的名称。第二个命令使用 HideComputerName 参数,该命令的输出不包括 PsComputerName 列。 使用 HideComputerName 参数不会更改该对象。您仍然可以使用 Format cmdlet 来显示任何受影响的对象的 PsComputerName 属性。
示例 11
C:\PS>invoke-command -comp (get-content servers.txt) -filepath c:\scripts\sample.ps1 -argumentlist Process, Service 说明 ----------- 此示例使用 Invoke-Command cmdlet 在 Servers.txt 文件中列出的所有计算机上运行 Sample.ps1 脚本。该命令使用 FilePath 参数来指定脚本文件。使用该命令可以在远程计算机上运行脚本,即使远程计算机无法访问脚本文件也是如此。 提交该命令时,Sample.ps1 文件的内容复制到脚本块中,且脚本块在每台远程计算机上运行。此过程等效于使用 ScriptBlock 参数来提交脚本的内容。
示例 12
C:\PS>$LiveCred = Get-Credential C:\PS> Invoke-Command -ConfigurationName Microsoft.Exchange ` -ConnectionUri https://ps.exchangelabs.com/powershell ` -Credential $LiveCred -Authentication Basic ` -scriptblock {Invoke-Command {Set-Mailbox dan -DisplayName "Dan Park"} 说明 ----------- 此示例说明如何在由 URI(Internet 地址)标识的远程计算机上运行命令。此特定示例在远程 Exchange 服务器上运行一个 Set-Mailbox 命令。命令中的倒引号 (`) 是 Windows PowerShell 继续符。 第一条命令使用 Get-Credential cmdlet 将 Windows Live ID 凭据存储在 $LiveCred 变量中。在出现凭据对话框时,输入 Windows Live ID 凭据。 第二条命令使用 Invoke-Command cmdlet 运行 Set-Mailbox 命令。该命令使用 ConfigurationName 参数来指定该命令应在使用 Microsoft.Exchange 会话配置的会话中运行。ConnectionURI 参数指定 Exchange 服务器终结点的 URL。 credential 参数指定 $LiveCred 变量中存储的 Windows Live 凭据。AuthenticationMechanism 参数指定基本身份验证的使用。ScriptBlock 参数指定包含命令的脚本块。
示例 13
C:\PS>$max = New-PSSessionOption -MaximumRedirection 1 C:\PS> Invoke-Command -ConnectionUri https://ps.exchangelabs.com/powershell ` -scriptblock {Invoke-Command {Get-Mailbox dan} ` -AllowRedirection -SessionOption $max 说明 ----------- 此命令说明如何使用 AllowRedirection 和 SessionOption 参数来管理远程命令中的 URI 重定向。 第一个命令使用 New-PSSessionOption cmdlet 来创建 PSSessionOpption 对象,并将该对象保存在 $max 变量中。该命令使用 MaximumRedirection 参数将 PSSessionOption 对象的 MaximumConnectionRedirectionCount 属性设置为 1。 第二个命令使用 Invoke-Command cmdlet 在运行 Microsoft Exchange Server 的远程服务器上运行 Get-Mailbox 命令。此命令使用 AllowRedirection 参数来提供将连接重定向到替代终结点的显式许可。它还使用 SessionOption 参数指定 $max 变量中的会话对象。 因此,如果 ConnectionURI 参数指定的远程计算机返回一个重定向消息,Windows PowerShell 将重定向该连接,但如果新目的地返回另一个重定向消息,则超过了重定向计数值 1,Invoke-Command 将返回一个非终止错误。
示例 14
C:\PS>$so = New-PSSessionOption -SkipCACheck PS C:\> invoke-command $s { get-hotfix } -SessionOption $so -credential server01\user01 说明 ----------- 此示例说明如何创建和使用 SessionOption 参数。 第一个命令使用 New-PSSessionOption cmdlet 创建会话选项。它将生成的 SessionOption 对象保存在 $so 参数中。 第二个命令使用 Invoke-Command cmdlet 远程运行一个 Get-Hotfix 命令。SessionOption 参数的值是 $so 变量中的 SessionOption 对象。
示例 15
C:\PS>enable-wsmanCredSSP -delegate server02 C:\PS> connect-wsman Server02 C:\PS> set-item wsman:\server02*\service\auth\credSSP -value $true C:\PS> $s = new-pssession server02 C:\PS> invoke-command -session $s -script {get-item \\Net03\Scripts\LogFiles.ps1} -authentication credssp -credential domain01\admin01 说明 ----------- 此示例说明如何从远程会话中访问网络共享。 该命令要求在本地计算机的客户端设置中以及远程计算机的服务设置中启用 CredSSP 委派。若要运行此示例中的命令,您必须是本地计算机和远程计算机上的 Administrators 组的成员。 第一条命令使用 Enable-WSManCredSSP cmdlet 启用从本地计算机 Server01 到远程计算机 Server02 的 CredSSP 委派。这会在本地计算机上配置 CredSSP 客户端设置。 第二条命令使用 Connect-WSman cmdlet 连接到计算机 Server02。此操作在本地计算机上的 WSMan: 驱动器中为计算机 Server02 添加一个节点,从而允许您查看和更改计算机 Server02 上的 WS-Management 设置。 第三条命令使用 Set-Item cmdlet 将计算机 Server02 的 Service 节点中 CredSSP 项的值更改为 True。此操作会在远程计算机上的服务设置中启用 CredSSP。 第四条命令使用 New-PSSession cmdlet 在计算机 Server02 上创建一个 PSSession。它将 PSSession 保存在 $s 变量中。 第五条命令使用 Invoke-Command cmdlet 在 $s 中的会话中运行从 Net03\Scripts 网络共享获取脚本的 Get-Item 命令。该命令使用 Credential 参数,并使用值为 CredSSP 的 Authentication 参数。
另请参阅