Invoke-Command

在本機與遠端電腦上執行命令。

Syntax

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>]

Description

Cmdlet 會在 Invoke-Command 本機或遠端電腦上執行命令,並從命令傳回所有輸出,包括錯誤。 您可以使用單 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 遠端處理的詳細資訊,請參閱 透過 SSH 進行 PowerShell 遠端處理。

某些程式碼範例會使用 Splatting 來減少線條長度。 如需詳細資訊,請參閱 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}

Cmdlet New-PSSession 會在 Server02 遠端電腦上建立會話,並將它儲存在變數中 $s 。 一般而言,只有在遠端電腦上執行一系列命令時,才會建立會話。

Cmdlet 會在 Invoke-CommandGet-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

前兩個命令會使用 的 Invoke-CommandComputerName參數,在 Server02 遠端電腦上執行命令。 第一個命令會 Get-Process 使用 Cmdlet 在遠端電腦上取得 PowerShell 進程,並將它儲存在變數中 $p 。 第二個命令會取得 PowerShell 處理程序的 VirtualMemorySize 屬性值。

當您使用 ComputerName 參數時,PowerShell 會建立新的會話來執行命令。 當命令完成時,會話會關閉。 變數 $p 是在一個連線中建立,但它不存在於針對第二個命令建立的連接中。

問題可藉由在遠端電腦上建立持續性會話,然後在相同的會話中執行這兩個命令來解決。

Cmdlet New-PSSession 會在 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

變數 $commandGet-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檔案的內容,也就是電腦名稱稱的檔案。

Cmdlet 會在 Invoke-Command 遠端電腦上執行 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

Cmdlet New-PSSession 會在 Server01 和 Server02 遠端電腦上建立會話。 Cmdlet 會在 Invoke-Command 每個會話中執行背景工作。 此命令使用 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。 Cmdlet 會在 Invoke-Command 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

前兩個 Get-Process 命令會用來 Invoke-Command 執行 PowerShell 進程的命令。 第一個命令的輸出包括 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$param2Get-ChildItem 會使用具名參數 、NameInclude 搭配變數名稱。 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) 識別的遠端電腦上執行命令。 這個特定範例會在 Set-Mailbox 遠端 Exchange 伺服器上執行命令。

$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 是雜湊表,其中包含要傳遞至 Cmdlet 的參數 Invoke-Command 。 Cmdlet Invoke-Command 會使用Microsoft.Exchange會話組態來執行 Set-Mailbox 命令。 ConnectionURI 參數指定 Exchange 伺服器端點的 URL。 Credential參數會指定儲存在變數中的認證 $LiveCredAuthenticationMechanism 參數指定使用基本驗證。 ScriptBlock 參數指定包含命令的指令碼區塊。

範例 15:使用會話選項

此範例示範如何建立和使用 SessionOption 參數。

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

Cmdlet 會 New-PSSessionOption 建立會話選項物件,讓遠端端在評估傳入 HTTPS 連線時,不會驗證憑證授權單位單位、正式名稱和撤銷清單。 SessionOption物件會儲存在變數中 $so

注意

停用這些檢查很方便進行疑難排解,但顯然不安全。

Cmdlet 會 Invoke-Command 從遠端執行 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

Cmdlet New-PSSessionOption 會建立儲存在變數中的 $maxPSSessionOption物件。 此命令使用 MaximumRedirection 參數將 PSSessionOption 物件的 MaximumConnectionRedirectionCount 屬性設定為 1。

Cmdlet 會在 Invoke-Command 遠端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

Cmdlet Enable-WSManCredSSP 會啟用從 Server01 本機電腦到 Server02 遠端電腦的 CredSSP 委派。 Role參數會指定用戶端在本機電腦上設定 CredSSP 用戶端設定。

New-PSSession 會建立 Server02 的 PSSession 物件,並將物件儲存在變數中 $s

Cmdlet Invoke-Command$s 使用 變數連線到遠端電腦 Server02。 ScriptBlock參數會在遠端電腦上執行 Enable-WSManCredSSPRole參數會指定要在遠端電腦上設定 CredSSP 伺服器設定的伺服器。

變數 $parameters 包含要連線到網路共用的參數值。 Cmdlet 會在 Invoke-Command 中的 $s 會話中執行 Get-Item 命令。 此命令會從 \\Net03\Scripts 網路共用取得腳本。 此命令會使用Authentication參數搭配CredSSP的值,以及具有Domain01\Admin01值的Credential參數。

範例 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值會設定為Drop而 IdleTimeout值會設定為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 工作階段選項值,限制連線重新導向的次數。 使用 Cmdlet 的 New-PSSessionOptionMaximumRedirection參數,或設定喜好設定變數的 $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

提供 scriptblock 的參數值。 腳本區塊中的參數會依提供給 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
  • Digest
  • Kerberos
  • 交涉
  • 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 必須是完整的 URI。

這個字串的格式如下所示:

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

預設值如下:

http://localhost:5985/WSMAN

如果您未指定連線 URI,您可以使用 UseSSL 參數來指定連線 URI 值。

URI 的 Transport 區段有效值為 HTTP 與 HTTPS。 如果您使用傳輸區段指定連線 URI,但未指定埠,則會使用標準埠建立會話:HTTP 為 80,而 HTTPS 則為 443。 若要使用 PowerShell 遠端處理的預設埠,請指定 HTTP 的埠 5985 或 HTTPS 的埠 5986。

如果目的地電腦將連線重新導向至不同的 URI,除非您在 命令中使用 AllowRedirection 參數,否則 PowerShell 會防止重新導向。

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

-ContainerId

指定容器識別碼的陣列。

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 ,命令會成功,但會忽略 參數。

您可以使用Authentication參數的CredSSP值,在回送會話中允許遠端存取,這個值會將會話認證委派給其他電腦。

若要保護電腦免于惡意存取,只有使用 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 可確保所有命令結果都會傳回重新連線的會話,而不是在會話之間分割。

您無法搭配Session參數或AsJob參數使用InDisconnectedSession

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

指定安全殼層 (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 遠端執行命令時,命令中的任何變數都會在遠端電腦上進行評估。

注意

scriptblock 的參數只能依位置從 ArgumentList 傳入。 參數無法依位置傳遞。 如果您需要類似 SwitchParameter 類型的參數,請改用 布林 類型。

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

-Session

指定此 Cmdlet 執行命令的會話陣列。 輸入包含 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)
  • 通訊埠
  • 使用者名稱
  • 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

指定用來在遠端電腦上執行命令之帳戶的使用者名稱。 使用者驗證方法取決於遠端電腦上如何設定安全殼層 (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

指定虛擬機器識別碼的陣列。

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 屬性。

Availability 值為 None 表示您可以連線工作階段。 [忙碌]的值表示您無法連線到PSSession,因為它已連線到另一個會話。 如需會話之 State 屬性值的詳細資訊,請參閱 RunspaceState。 如需會話 可用性 屬性值的詳細資訊,請參閱 RunspaceAvailability

HostNameSSHConnection參數從 PowerShell 6.0 開始包含。 它們已新增,以根據安全殼層 (SSH) 提供 PowerShell 遠端處理。 Windows、Linux、macOS) 和 PowerShell 遠端處理在安裝及設定 PowerShell 和 SSH 的多個 (平臺上支援 PowerShell 和 SSH。 這與先前的 Windows 僅遠端處理不同,以 WinRM 為基礎,而且許多 WinRM 特定功能和限制都不適用。 例如,目前不支援以 WinRM 為基礎的配額、會話選項、自訂端點設定和中斷連線/重新連線功能。 如需如何設定 PowerShell SSH 遠端處理的詳細資訊,請參閱 透過 SSH 進行 PowerShell 遠端處理。