共用方式為


Invoke-Command

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

Syntax

Invoke-Command
      [-ScriptBlock] <scriptblock>
      [-NoNewScope]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-Session] <PSSession[]>]
      [-ScriptBlock] <scriptblock>
      [-ThrottleLimit <int>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <string>]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-Session] <PSSession[]>]
      [-FilePath] <string>
      [-ThrottleLimit <int>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <string>]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-ComputerName] <string[]>]
      [-ScriptBlock] <scriptblock>
      [-Credential <pscredential>]
      [-Port <int>]
      [-UseSSL]
      [-ConfigurationName <string>]
      [-ApplicationName <string>]
      [-ThrottleLimit <int>]
      [-AsJob]
      [-InDisconnectedSession]
      [-SessionName <string[]>]
      [-HideComputerName]
      [-JobName <string>]
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [-CertificateThumbprint <string>]
      [<CommonParameters>]
Invoke-Command
      [[-ComputerName] <string[]>]
      [-FilePath] <string>
      [-Credential <pscredential>]
      [-Port <int>]
      [-UseSSL]
      [-ConfigurationName <string>]
      [-ApplicationName <string>]
      [-ThrottleLimit <int>]
      [-AsJob]
      [-InDisconnectedSession]
      [-SessionName <string[]>]
      [-HideComputerName]
      [-JobName <string>]
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [[-ConnectionUri] <uri[]>]
      [-ScriptBlock] <scriptblock>
      [-Credential <pscredential>]
      [-ConfigurationName <string>]
      [-ThrottleLimit <int>]
      [-AsJob]
      [-InDisconnectedSession]
      [-HideComputerName]
      [-JobName <string>]
      [-AllowRedirection]
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [-CertificateThumbprint <string>]
      [<CommonParameters>]
Invoke-Command
      [[-ConnectionUri] <uri[]>]
      [-FilePath] <string>
      [-Credential <pscredential>]
      [-ConfigurationName <string>]
      [-ThrottleLimit <int>]
      [-AsJob]
      [-InDisconnectedSession]
      [-HideComputerName]
      [-JobName <string>]
      [-AllowRedirection]
      [-SessionOption <PSSessionOption>]
      [-Authentication <AuthenticationMechanism>]
      [-EnableNetworkAccess]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-VMId] <guid[]>
      [-ScriptBlock] <scriptblock>
      -Credential <pscredential>
      [-ConfigurationName <string>]
      [-ThrottleLimit <int>]
      [-AsJob]
      [-HideComputerName]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-ScriptBlock] <scriptblock>
      -Credential <pscredential>
      -VMName <string[]>
      [-ConfigurationName <string>]
      [-ThrottleLimit <int>]
      [-AsJob]
      [-HideComputerName]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-VMId] <guid[]>
      [-FilePath] <string>
      -Credential <pscredential>
      [-ConfigurationName <string>]
      [-ThrottleLimit <int>]
      [-AsJob]
      [-HideComputerName]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-FilePath] <string>
      -Credential <pscredential>
      -VMName <string[]>
      [-ConfigurationName <string>]
      [-ThrottleLimit <int>]
      [-AsJob]
      [-HideComputerName]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-ScriptBlock] <scriptblock>
      -HostName <string[]>
      [-Port <int>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <string>]
      [-UserName <string>]
      [-KeyFilePath <string>]
      [-Subsystem <string>]
      [-ConnectingTimeout <int>]
      [-SSHTransport]
      [-Options <hashtable>]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-ScriptBlock] <scriptblock>
      -ContainerId <string[]>
      [-ConfigurationName <string>]
      [-ThrottleLimit <int>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <string>]
      [-RunAsAdministrator]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-FilePath] <string>
      -ContainerId <string[]>
      [-ConfigurationName <string>]
      [-ThrottleLimit <int>]
      [-AsJob]
      [-HideComputerName]
      [-JobName <string>]
      [-RunAsAdministrator]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      [-ScriptBlock] <scriptblock>
      -SSHConnection <hashtable[]>
      [-AsJob]
      [-HideComputerName]
      [-JobName <string>]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      -FilePath <string>
      -HostName <string[]>
      [-AsJob]
      [-HideComputerName]
      [-UserName <string>]
      [-KeyFilePath <string>]
      [-Subsystem <string>]
      [-ConnectingTimeout <int>]
      [-SSHTransport]
      [-Options <hashtable>]
      [-RemoteDebug]
      [-InputObject <psobject>]
      [-ArgumentList <Object[]>]
      [<CommonParameters>]
Invoke-Command
      -FilePath <string>
      -SSHConnection <hashtable[]>
      [-AsJob]
      [-HideComputerName]
      [-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 遠端處理

某些程式代碼範例會使用曲線來減少行長度。 如需詳細資訊,請參閱 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 -FilterScript { $_.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,以顯示清單中作業物件的所有屬性。 最後一個命令會取得作業的結果。 它會使用管線將作業物件傳送 $jReceive-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:隱藏計算機名稱

此範例顯示使用 的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 -HideComputerName -ScriptBlock {
    Get-Process PowerShell
}

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 參數來指定指令檔。 此命令可讓您在遠端電腦上執行腳本,即使遠端電腦無法存取腳本檔案也一樣。

$parameters = @{
    ComputerName = (Get-Content Servers.txt)
    FilePath     = 'C:\Scripts\Sample.ps1'
    ArgumentList = 'Process', 'Service'
}
Invoke-Command @parameters

當您提交命令時,檔案的內容 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
$parameters = @{
    ComputerName  = 'server01'
    UseSSL        = $true
    ScriptBlock   = { Get-HotFix }
    SessionOption = $so
    Credential    = 'server01\user01'
}
Invoke-Command @parameters

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 用戶端設定的 Client

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         = [timespan]::FromHours(12)
  }
}
Invoke-Command @parameters

命令會使用 Invoke-Command 來執行腳本。 ComputerName 參數的值是一個Get-Content命令,可從文本檔取得遠端電腦的名稱。 InDisconnectedSession 參數會在一啟動命令時就將工作階段中斷連線。 FilePath 參數的值是在每個電腦上執行的腳本Invoke-Command

SessionOption 的值是哈希表。 OutputBufferingMode 值會設定為 Drop而IdleTimeout值會設定為12小時。

若要取得在中斷聯機會話中執行的命令和腳本結果,請使用 Receive-PSSession Cmdlet。

範例 19:使用 SSH 在遠端電腦上執行命令

此範例示範如何使用安全殼層 (SSH) ,在遠端電腦上執行命令。 如果遠端電腦上已設定 SSH 來提示輸入密碼,您會收到密碼提示。 否則,您必須使用 SSH 金鑰型使用者驗證。

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

範例 20:使用 SSH 在遠端電腦上執行命令,並指定使用者驗證密鑰

此範例示範如何使用 SSH 在遠端電腦上執行命令,並指定金鑰檔以進行使用者驗證。 除非您的金鑰驗證失敗,且遠端電腦設定為允許基本密碼驗證,否則不會提示您輸入密碼。

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

範例 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\GetInfo.ps1 -SSHConnection $sshConnections

範例 22:使用 SSH 選項連線到遠端 SSH 工作階段

此範例示範如何使用 SSH 選項,在遠端 Linux 型電腦上執行腳本檔案。 Options 參數會接受值哈希表,這些值會當做選項傳遞至基礎ssh命令,而建立與遠端系統的連線。

$options = @{
    Port=22
    User = 'UserB'
    Host = 'LinuxServer5'
}
$results = Invoke-Command -FilePath c:\Scripts\CollectEvents.ps1 -KeyFilePath '/Users/UserB/id_rsa' -Options $options

參數

-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 操作系統。

此參數可接受的值如下所示:

  • Default
  • 基本資訊
  • 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)。 請輸入憑證的憑證指紋。

憑證將用於用戶端憑證式驗證。 它們只能對應到本機用戶帳戶,而且無法與網域帳戶搭配使用。

若要取得憑證指紋,請使用 Get-Item PowerShell憑證: 磁碟驅動器中的或 Get-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

-ConnectingTimeout

指定允許初始 SSH 連線完成的毫秒時間量。 如果連線未在指定時間內完成,則會傳回錯誤。

此參數是在 PowerShell 7.2 中引進的

Type:Int32
Position:Named
Default value:Unlimited
Required:False
Accept pipeline input:False
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

-Options

指定連線到遠端 SSH 型工作階段時所使用的 SSH 選項哈希表。 可能的選項是 Unix 型 ssh 命令版本所支援的任何值。

參數明確傳遞的任何值都優先於 選項 哈希表中傳遞的值。 例如,使用 Port 參數會覆寫在 Options 哈希表中傳遞的任何Port索引鍵/值組。

此參數已在PowerShell 7.3中新增。

Type:Hashtable
Position:Named
Default value:None
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 參數,否則請勿使用 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 建立的物件,或索引鍵為會話選項名稱的哈希表,以及值是會話選項值。

注意

如果您指定 SessionOption 的哈希表,PowerShell 會將哈希表轉換成 System.Management.Autiomation.Remoting.PSSessionOption 物件。 哈希表中所指定索引鍵的值會轉換成 物件的相符屬性。 這與呼叫 New-PSSessionOption的方式不同。 例如,Timeout 屬性的 System.TimeSpan 值,例如 IdleTimeout,會將整數值轉換成刻度,而不是毫秒。 如需 PSSessionOption 物件及其屬性的詳細資訊,請參閱 PSSessionOption

如果已設定,選項的預設值取決於喜好設定變數的值 $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:False
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

如果您使用 AsJob 參數,此 Cmdlet 會傳回作業物件。

PSSession

如果您使用 InDisconnectedSession 參數,此 Cmdlet 會傳回 PSSession 物件。

Object

根據預設,此 Cmdlet 會傳回叫用命令的輸出,這是 ScriptBlock 參數的值。

備註

PowerShell 包含的下列別名 Invoke-Command

  • 所有平台:
    • icm

在 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 的連線時,會話狀態為 Disconnected,且可用性為 NoneState 屬性的值是相對於目前工作階段。 [ 已中斷連線 ] 值表示 PSSession 未連線到目前的會話。 不過,這並不表示 PSSession 與所有會話中斷連線。 它可能連線不同的工作階段。 若要判斷是否可以連線或重新連線工作階段,請使用 Availability 屬性。

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

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

可執行檔案 ssh 會依下列順序從下列來源取得組態資料:

  1. 命令列選項
  2. 使用者的組態檔 (~/.ssh/config)
  3. 全系統組態檔 (/etc/ssh/ssh_config)

下列 Cmdlet 參數會對應至 ssh 參數和選項:

Cmdlet 參數 ssh 參數 對等 ssh -o 選項
-KeyFilePath -i <KeyFilePath> -o IdentityFile=<KeyFilePath>
-UserName -l <UserName> -o User=<UserName>
-Port -p <Port> -o Port=<Port>
-ComputerName -Subsystem -s <ComputerName> <Subsystem> -o Host=<ComputerName>

參數明確傳遞的任何值都優先於 選項 哈希表中傳遞的值。 如需檔案的詳細資訊 ssh_config ,請參閱 ssh_config (5)