Invoke-Command

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

Syntax

Invoke-Command
      [-StrictMode <Version>]
      [-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>]
      [-Subsystem <String>]
      [-ConnectingTimeout <Int32>]
      [-SSHTransport]
      [-Options <Hashtable>]
      [-RemoteDebug]
      [-InputObject <PSObject>]
      [-ArgumentList <Object[]>]
      [<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>]
      [-Subsystem <String>]
      [-ConnectingTimeout <Int32>]
      [-SSHTransport]
      [-Options <Hashtable>]
      [-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-Command Session 參數在 PSSession執行命令。 若要在中斷連線的會話中執行命令,請使用 InDisconnectedSession 參數。 若要在背景作業中執行命令,請使用 AsJob 參數。

您也可以在本機計算機上使用 Invoke-Command ,以命令的形式執行腳本區塊。 PowerShell 會立即在目前範圍的子範圍中執行腳本區塊。

使用 Invoke-Command 在遠端電腦上執行命令之前,請先讀取 about_Remote

從 PowerShell 6.0 開始,您可以使用安全殼層 (SSH) 來建立遠端電腦上的命令連線並叫用命令。 SSH 必須安裝在本機電腦上,而且遠端電腦必須使用 PowerShell SSH 端點進行設定。 SSH 型 PowerShell 遠端會話的優點是,其可跨多個平台運作(Windows、Linux、macOS)。 針對 SSH 型工作階段,您可以使用 HostNameSSH 連線 ion 參數來指定遠端電腦和相關連線資訊。 如需如何設定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-Command Server02 上執行 Get-Culture 命令。 Session 參數會指定儲存在變數中的$s會話。

回應中,PowerShell 會在 Server02 計算機上的會話中執行 命令。

範例 4:使用會話來執行一系列共享數據的命令

此範例會比較 使用 ComputerNameSession 參數 Invoke-Command的效果。 它示範如何使用會話來執行一系列共用相同數據的命令。

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

17930240

前兩個命令會使用 的 Invoke-Command ComputerName 參數,在 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,以顯示清單中作業物件的所有屬性。 最後一個命令會取得作業的結果。 它會使用管線將作業物件 $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:隱藏計算機名稱

此範例顯示使用 的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 關鍵詞

Param關鍵詞和 ArgumentList 參數可用來將變數值傳遞至腳本區塊中的具名參數。 此範例會顯示開頭為字母 a 且擴展名為 .pdf 的檔名。

如需 關鍵詞的詳細資訊 Param ,請參閱 about_Language_Keywords

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

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

Invoke-Command使用 ScriptBlock 參數來定義兩個變數和 $param1$param2Get-ChildItem會使用具名參數 Name Include 搭配變數名稱。 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 會將數位值傳遞至 Get-ChildItem PathFilter 的參數位置。$args

範例 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) 所識別的遠端電腦上執行命令。 這個特定範例會在遠端 Exchange 伺服器上執行 Set-Mailbox 命令。

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

第一行會 Get-Credential 使用 Cmdlet 將 Windows Live ID 認證儲存在變數中 $LiveCred 。 PowerShell 會提示使用者輸入 Windows Live ID 認證。

變數 $parameters 是哈希表,其中包含要傳遞至 Invoke-Command Cmdlet 的參數。 Cmdlet Invoke-CommandSet-Mailbox 會使用 Microsoft.Exchange 會話設定來執行命令。 連線 ionURI 參數會指定 Exchange 伺服器端點的 URL。 Credential 參數會指定儲存在 變數中的$LiveCred認證。 AuthenticationMechanism 參數會指定基本身份驗證的使用方式。 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建立儲存在變數中的 $max PSSessionOption 物件。 此命令會使用 MaximumRedirection 參數,將 PSSessionOption 物件的 Maximum 連線 ionRedirectionCount 屬性設定為 1。

Cmdlet 會在 Invoke-Command 遠端 Microsoft Exchange Server 上執行 Get-Mailbox 命令。 AllowRedirection 參數提供將連線重新導向至替代端點的明確許可權。 SessionOption 參數會使用儲存在 變數中的$max會話物件。

因此,如果 連線 ionURI 指定的遠端電腦傳回重新導向訊息,PowerShell 會重新導向連線,但如果新的目的地傳回另一個重新導向訊息,則會超過重新導向計數值 1,並Invoke-Command傳回非終止錯誤。

範例 17:存取遠端會話中的網路共用

此範例示範如何從遠端會話存取網路共用。 三部計算機可用來示範此範例。 Server01 是本機計算機,Server02 是遠端計算機,而 Net03 則包含網路共用。 Server01 會連線到 Server02,然後 Server02 對 Net03 執行第二個躍點來存取網路共用。 如需PowerShell遠端在電腦之間如何支持躍點的詳細資訊,請參閱 在PowerShell遠端中建立第二個躍點。

必要的認證安全性支援提供者 (CredSSP) 委派會在本機電腦上的用戶端設定和遠端電腦上的服務設定中啟用。 若要執行此範例中的命令,您必須是本機計算機和遠端電腦上 管理員 istrators 群組的成員

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\管理員 01 值的 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 和 SSH 連線 ion 參數集,在多部遠端電腦上執行腳本檔案。 SSH 連線 ion 參數會採用哈希表數位列,其中包含每部計算機的連線資訊。 此範例會要求目標遠端計算機已設定 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)。

當您使用 連線 ionURI 參數時,遠端目的地可以傳回指示以重新導向至不同的 URI。 根據預設,PowerShell 不會重新導向連線,但您可以使用此參數來允許它重新導向連線。

您也可以變更 Maximum 連線 ionRedirectionCount 會話選項值,以限制重新導向連線的次數。 使用 Cmdlet 的 New-PSSessionOption MaximumRedirection 參數,或設定喜好設定變數的 $PSSessionOption Maximum 連線 ionRedirectionCount 屬性。 預設值是 5。

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

-ApplicationName

指定連線 URI 的應用程式名稱區段。 當您不使用 命令中的 連線 ionURI 參數時,請使用此參數來指定應用程式名稱。

預設值是本機電腦上的喜好設定變數值 $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

-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 必須完整。

此字串格式如下所示:

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

預設值如下:

http://localhost:5985/WSMAN

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

URI 傳輸區段的有效值為 HTTP 和 HTTPS。 如果您使用傳輸區段指定連線 URI,但未指定埠,則會使用標準埠建立會話:80 代表 HTTP,而 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

指定具有執行此動作許可權的用戶帳戶。 預設為目前使用者。

輸入用戶名稱,例如User01或Domain01\User01,或輸入 Cmdlet 所產生的 Get-Credential PSCredential 物件。 如果您輸入使用者名稱,系統會提示您輸入密碼。

認證會儲存在 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 參數,或將其值設定為 dot (.)、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 參數時,請使用 $Input ScriptBlock 參數值中的自動變數來代表輸入物件。

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 命令版本所支援的任何值。

參數明確傳遞的任何值優先於Options哈希表中傳遞的值。 例如,使用 Port 參數會覆寫在 Options 哈希表中傳遞的任何Port機碼/值組。

此參數已在PowerShell 7.3中新增。

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

-Port

指定遠端電腦上用於此命令的網路埠。 若要連線到遠端電腦,遠端計算機必須接聽連線所使用的埠。 默認埠為 5985(適用於 HTTP 的 WinRM 連接埠)和 5986(適用於 HTTPS 的 WinRM 連接埠)。

使用替代埠之前,請先將遠端電腦上的 WinRM 接聽程式設定為在該埠上接聽。 若要設定接聽程式,請在PowerShell提示字元中輸入下列兩個命令:

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

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

除非您必須,否則請勿使用 Port 參數。 命令中設定的埠會套用至命令執行所在的所有計算機或會話。 替代埠設定可能會防止命令在所有計算機上執行。

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 會叫用命令做為 管理員 istrator。

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 物件,例如您使用 Cmdlet 建立New-PSSessionOption的物件,或索引鍵是會話選項名稱的哈希表,而值是會話選項值。

注意

如果您為 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) 連線所需的一或多個連線參數。 SSH 連線 ion 參數適用於建立多個會話,其中每個會話都需要不同的連線資訊。

哈希表具有下列成員:

  • 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: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 作業系統上,若要使用 的 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 且可用性為 None。 State 屬性的值相對於目前的會話。 已中斷連線的值表示 PSSession 未連線到目前的會話。 不過,這並不表示 PSSession 已與所有會話中斷連線。 它可能會連線到不同的會話。 若要判斷您是否可以連線或重新連線到會話,請使用 Availability 屬性。

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

從 PowerShell 6.0 開始,包含 HostNameSSH 連線 ion 參數。 它們已新增為根據安全殼層 (SSH) 提供 PowerShell 遠端功能。 在多個平臺上支援PowerShell和SSH(Windows、Linux、macOS)和PowerShell遠端處理,這些平臺會安裝並設定PowerShell和SSH。 這與先前的 Windows 只有以 WinRM 為基礎的遠端處理不同,而且許多 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>

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