共用方式為


Invoke-Command

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

語法

Invoke-Command [-ScriptBlock] <scriptblock> [[-ComputerName] <string[]>] [-ApplicationName <string>] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-CertificateThumbprint <string>] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-Port <int>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-UseSSL] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-FilePath] <string> [[-ComputerName] <string[]>] [-ApplicationName <string>] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-Port <int>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-UseSSL] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-FilePath] <string> [[-Session] <PSSession[]>] [-AsJob] [-HideComputerName] [-JobName <string>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-FilePath] <string> [[-ConnectionURI] <Uri[]>] [-AllowRedirection] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-ScriptBlock] <scriptblock> [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-ScriptBlock] <scriptblock> [[-Session] <PSSession[]>] [-AsJob] [-HideComputerName] [-JobName <string>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-ScriptBlock] <scriptblock> [[-ConnectionURI] <Uri[]>] [-AllowRedirection] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-CertificateThumbprint <string>] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

描述

Invoke-Command Cmdlet 會在本機或遠端電腦執行命令,並傳回命令的所有輸出,包括錯誤。您可以使用單一的 Invoke-Command 命令,在多部電腦執行命令。

若要在遠端電腦執行單一命令,請使用 ComputerName 參數。若要執行共用資料的一系列相關命令,請在遠端電腦建立 PSSession (固定連線),然後使用 Invoke-Command 的 Session 參數在 PSSession 中執行命令。

您也可以在本機電腦使用 Invoke-Command,將指令碼區塊中的字串當做命令來評估或執行。Windows PowerShell 會將指令碼區塊轉換成命令,並立即在目前的範圍中執行命令,而不是只在命令列中回應該字串。

使用 Invoke-Command 在遠端電腦執行命令之前,請參閱 about_Remote。

參數

-AllowRedirection

允許這個連線重新導向到其他 URI。

在使用 ConnectionURI 參數時,遠端目的地可能會傳回指示,以重新導向至不同的 URI。根據預設,Windows PowerShell 不會重新導向連線,但是您可以使用 AllowRedirection 參數允許它重新導向連線。

您也可以設定 $PSSessionOption 喜好設定變數的 MaximumConnectionRedirectionCount 屬性或 SessionOption 參數的 MaximumConnectionRedirectionCount 屬性值,藉此限制連線的重新導向次數。預設值為 5。如需詳細資訊,請參閱 SessionOption 參數的描述以及 New-PSSessionOption Cmdlet 的說明主題。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

-ApplicationName <string>

指定連線 URI 的應用程式名稱區段。當您沒有在命令中使用 ConnectionURI 參數時,可以使用此參數指定應用程式名稱。

預設值為本機電腦上的 $PSSessionApplicationName 喜好設定變數的值。如果沒有定義此喜好設定變數,則預設值為 WSMAN。這個值適合大部分使用情況。如需詳細資訊,請參閱 about_Preference_Variables。

WinRM 服務會使用應用程式名稱來選取要服務連線要求的接聽程式。這個參數的值必須符合遠端電腦上接聽程式的 URLPrefix 屬性值。

必要?

false

位置?

named

預設值

WSMAN

接受管線輸入?

true (ByPropertyName)

接受萬用字元?

false

-ArgumentList <Object[]>

提供命令中的區域變數值。在遠端電腦執行命令之前,這些值會取代命令中的變數。請在清單中輸入以逗號分隔的值。這些值會依照列出的順序與變數產生關聯。ArgumentList 的別名為 "Args"。

ArgumentList 中的值可以是實際值 (如 "1024") 或是區域變數的參考 (如 "$max")。

若要在命令中使用區域變數,請採用下列命令格式:

{param($<name1>[, $<name2>]...)<command-with-local-variables>} -ArgumentList <value | $local-variable>

"param" 關鍵字會列出命令中使用的區域變數。ArgumentList 參數會依照變數的列出順序提供變數值。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

-AsJob

在遠端電腦將背景工作當做命令來執行。此參數可以用來執行需時甚久才能完成的命令。

使用 AsJob 時,此命令會傳回表示工作的物件,然後顯示命令提示字元。工作完成時,您可以繼續在工作階段中執行工作。若要管理工作,請使用各項 Job Cmdlet。若要取得工作結果,請使用 Receive-Job。

AsJob 參數的作用,與使用 Invoke-Command 從遠端執行 Start-Job 命令類似。然而,配搭 AsJob 時,即使工作是在遠端電腦執行,但仍是在本機電腦建立工作。此外,遠端工作的結果也會自動傳回到本機電腦。

如需 Windows PowerShell 背景工作的詳細資訊,請參閱 about_Jobs 和 about_Remote_Jobs。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

-Authentication <AuthenticationMechanism>

指定用來驗證使用者認證的機制。有效值為 Default、Basic、Credssp、Digest、Kerberos、Negotiate 和 NegotiateWithImplicitCredential。預設值為 Default。

CredSSP 驗證僅適用於 Windows Vista、Windows Server 2008 和更新版的 Windows。

如需此參數之值的詳細資訊,請參閱 MSDN 中的 System.Management.Automation.Runspaces.AuthenticationMechanism 列舉說明。

警告:認證安全性服務提供者 (CredSSP) 驗證 (其中使用者的認證會傳送到遠端電腦) 是專為需要對一個以上的資源進行驗證的命令所設計,例如存取遠端網路共用。此機制會提高遠端操作的安全性風險。如果遠端電腦已經遭受危害,則傳遞給遠端電腦的認證可能會被用來控制網路工作階段。

必要?

false

位置?

named

預設值

Default

接受管線輸入?

false

接受萬用字元?

false

-CertificateThumbprint <string>

對於具有執行此動作之權限的使用者帳戶,指定其數位公開金鑰憑證 (X509)。請輸入憑證的憑證指紋。

憑證係在進行用戶端憑證式驗證時使用。這些憑證只能對應到本機使用者帳戶,並不適用於網域帳戶。

若要取得憑證指紋,請在 Windows PowerShell 的 Cert: 磁碟機中使用 Get-ItemGet-ChildItem 命令。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

-ComputerName <string[]>

指定執行命令的電腦。預設為本機電腦。

使用 ComputerName 參數時,Windows PowerShell 會建立暫時連線,這個連線在執行完指定的命令之後便會關閉。如果您需要固定連線,請使用 Session 參數。

請在清單中以逗號分隔的方式,輸入一部或多部電腦的 NETBIOS 名稱、IP 位址或完整網域名稱。若要指定本機電腦,請輸入電腦名稱、"localhost" 或點 (.)。

若要在 ComputerName 參數的值中使用 IP 位址,命令必須包含 Credential 參數。而且,該電腦必須設定成 HTTPS 傳輸,或者遠端電腦的 IP 位址必須包含在本機電腦的 WinRM TrustedHosts 清單中。如需將電腦名稱新增到 TrustedHosts 清單的指示,請參閱 about_Remote_Troubleshooting 中的<如何將電腦新增到信任的主機清單>。

注意:在 Windows Vista 和更新版的 Windows 上,若要在 ComputerName 參數值中包含本機電腦,您必須以 [以系統管理員身分執行] 選項開啟 Windows PowerShell。

必要?

false

位置?

1

預設值

接受管線輸入?

true (ByPropertyName)

接受萬用字元?

false

-ConfigurationName <string>

指定用於新 PSSession 的工作階段設定。

請輸入工作階段設定的設定名稱或完整資源 URI。如果只指定設定名稱,則會在其前面加上下列結構描述 URI:https://schemas.microsoft.com/powershell。

工作階段的工作階段設定是位於遠端電腦。如果遠端電腦上沒有指定的工作階段設定,則命令會失敗。

預設值為本機電腦上的 $PSSessionConfigurationName 喜好設定變數的值。如果沒有設定此喜好設定變數,則預設值為 Microsoft.PowerShell。如需詳細資訊,請參閱 about_preference_variables。

必要?

false

位置?

named

預設值

https://Schemas.Microsoft.com/PowerShell/Microsoft.PowerShell

接受管線輸入?

true (ByPropertyName)

接受萬用字元?

false

-ConnectionURI <Uri[]>

指定定義連線端點的統一資源識別項 (URI)。此 URI 必須是完整的 URI。

此字串的格式為:

<傳輸方式>://<電腦名稱>:<連接埠>/<應用程式名稱>

預設值為:

http://localhost:80/WSMAN

URI 中傳輸方式區段的有效值為 HTTP 和 HTTPS。如果未指定 ConnectionURI,就必須使用 UseSSL、ComputerName、Port 和 ApplicationName 參數指定 URI 值。

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

必要?

false

位置?

1

預設值

http://localhost:80/wsman

接受管線輸入?

true (ByPropertyName)

接受萬用字元?

false

-Credential <PSCredential>

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

請輸入使用者名稱,例如 "User01" 或 "Domain01\User01",或是輸入含 PSCredential 物件的變數,例如 Get-Credential Cmdlet 所產生的物件。當您輸入使用者名稱時,會提示您輸入密碼。

必要?

false

位置?

named

預設值

接受管線輸入?

true (ByPropertyName)

接受萬用字元?

false

-FilePath <string>

在一部或多部遠端電腦上執行指定的本機指令碼。請輸入指令碼的路徑和檔名,或經由管道將指令碼路徑輸出至 Invoke-Command。此指令碼必須存在於本機電腦或本機電腦可存取的目錄中。請使用 ArgumentList 參數指定指令碼中參數的值。

使用此參數時,Windows PowerShell 會將指定之指令碼檔案的內容轉換成指令碼區塊,然後將該指令碼區塊傳送到遠端電腦,再於遠端電腦執行該指令碼區塊。

必要?

true

位置?

2

預設值

接受管線輸入?

false

接受萬用字元?

false

-HideComputerName

在輸出顯示中省略每一個物件的電腦名稱。根據預設,螢幕上會顯示產生物件的電腦名稱。

此參數只對輸出顯示有影響,而不會變更物件。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

-InputObject <psobject>

指定命令的輸入。請輸入包含物件的變數,或輸入可取得物件的命令或運算式。

使用 InputObject 時,請在 ScriptBlock 參數的值中使用 $input 自動變數,以表示輸入物件。

必要?

false

位置?

named

預設值

接受管線輸入?

true (ByValue)

接受萬用字元?

false

-JobName <string>

指定好記的背景工作名稱。根據預設,工作會命名為 "Job<n>",其中 <n> 為序數。此參數只能與 AsJob 參數搭配使用。

如果您在命令中使用 JobName 參數,則會將命令當成工作來執行,且 Invoke-Command 會傳回工作物件,即使命令中不包含 AsJob 參數也是如此。

如需 Windows PowerShell 背景工作的詳細資訊,請參閱 about_Jobs。

必要?

false

位置?

named

預設值

Job<n>

接受管線輸入?

false

接受萬用字元?

false

-Port <int>

指定遠端電腦上要供此命令使用的網路連接埠。預設為連接埠 80 (HTTP 連接埠)。

使用其他連接埠之前,必須先於遠端電腦上設定 WinRM 接聽程式,以接聽該連接埠。若要設定接聽程式,請在 Windows PowerShell 提示字元中輸入下列兩個命令:

remove-item -path wsman:\Localhost\listener\listener* -recurse

new-item -path wsman:\Localhost\listener -Transport http -Address * -port <連接埠號碼>

除非必要,否則請勿使用 Port 參數。命令中的 Port 設定適用於執行命令的所有電腦或工作階段。其他連接埠設定可能會導致無法在所有電腦上執行命令。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

-ScriptBlock <scriptblock>

指定要執行的命令。請以大括號 ( { } ) 括住命令以建立指令碼區塊。此參數為必要項。

根據預設,命令中的所有變數都會在遠端電腦進行評估。若要在命令中加上區域變數,請使用 ArgumentList 參數。

必要?

true

位置?

1

預設值

接受管線輸入?

false

接受萬用字元?

false

-Session <PSSession[]>

在指定的 Windows PowerShell 工作階段 (PSSession) 中執行命令。請輸入包含 PSSession 的變數,或者輸入建立或取得 PSSession 的命令,例如 New-PSSessionGet-PSSession 命令。

建立 PSSession 時,Windows PowerShell 會建立與遠端電腦之間的固定連線。請使用 PSSession 來執行共用資料的一系列相關命令。若要執行單一命令或一系列相關命令,請使用 ComputerName 參數。

若要建立 PSSession,請使用 New-PSSession Cmdlet。如需詳細資訊,請參閱 about_PSSessions。

必要?

false

位置?

1

預設值

接受管線輸入?

true (ByPropertyName)

接受萬用字元?

false

-SessionOption <PSSessionOption>

設定工作階段的進階選項。請輸入使用 New-PSSessionOption Cmdlet 所建立的 SessionOption 物件。

如果有設定 $PSSessionOption 喜好設定變數的值,它會決定選項的預設值。否則,工作階段會使用系統預設值。

如需工作階段選項 (包括預設值) 的描述,請參閱 New-PSSessionOption Cmdlet 的說明主題。如需 $PSSessionOption 喜好設定變數的詳細資訊,請參閱 about_Preference_Variables。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

-ThrottleLimit <int>

指定可以建立以執行此命令之同時連線數目的上限。如果您省略這個參數或輸入 0 這個值,則會使用預設值 32。

節流閥限制只適用於目前的命令,並不適用於工作階段或電腦。

必要?

false

位置?

named

預設值

32

接受管線輸入?

false

接受萬用字元?

false

-UseSSL

使用安全通訊端層 (SSL) 通訊協定建立與遠端電腦的連線。預設不會使用 SSL,

因為 WS-Management 會將所有透過網路傳輸的 Windows PowerShell 內容加密。使用 UseSSL 時,便會透過 HTTPS (而非 HTTP) 傳送資料,提供多一層防護。

如果使用此參數,但是供命令使用的連接埠無法使用 SSL,則命令會失敗。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

<CommonParameters>

這個 Cmdlet 支援一般參數:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。如需詳細資訊,請參閱 about_Commonparameters.

輸入和輸出

輸入型別是可經由管道輸出至 Cmdlet 的物件型別。傳回型別則是 Cmdlet 所傳回的物件型別。

輸入

System.Management.Automation.ScriptBlock

您可以經由管道將指令碼區塊中的命令輸出至 Invoke-Command。請使用 $input 自動變數表示命令中的輸入物件。

輸出

System.Management.Automation.PSRemotingJob 或叫用命令的輸出

使用 AsJob 參數時,Invoke-Command 會傳回工作物件。否則,它會傳回叫用命令的輸出 (ScriptBlock 參數的值)。

附註

-- 對於 Windows Vista 與較新的 Windows 版本,若要使用 Invoke-Command 的 ComputerName 參數在本機電腦執行命令,必須以 [以系統管理員身分執行] 選項開啟 Windows PowerShell。

-- 在多部電腦執行命令時,Windows PowerShell 會依照電腦出現在清單中的順序,連線到這些電腦。不過,命令輸出會依遠端電腦所擷取的命令順序來顯示,而可能不同。

-- Invoke-Command 執行之命令所產生的錯誤包含在命令結果中。本機命令中的終止錯誤在遠端命令中會被視為非終止錯誤。此策略可確保某一台電腦發生終止錯誤時,不會在執行命令的所有電腦終止該命令。即使遠端命令是在單一電腦執行,也會採用這種做法。

-- 如果遠端電腦不在本機電腦信任的網域中,電腦可能無法驗證使用者的認證。若要在 WS-Management 中將遠端電腦新增至「信任的主機」清單,請在 WSMAN 提供者中使用下列命令 (其中 <遠端電腦名稱> 是遠端電腦的名稱):

set-item -path wsman:\Localhost\Client\TrustedHosts -value <遠端電腦名稱>。

範例 1

C:\PS>invoke-command -filepath c:\scripts\test.ps1 -computerName Server01

Disks: C:, D:, E:
Status: Warning, Normal, Normal

描述
-----------
這個命令會在 Server01 電腦上執行 Test.ps1 指令碼。

此命令會使用 FilePath 參數來指定位於本機電腦上的指令碼。這個指令碼會在遠端電腦上執行,而且結果會傳回本機電腦。





範例 2

C:\PS>invoke-command -computername server01 -credential domain01\user01 -scriptblock {get-culture}

描述
-----------
這個命令會在 Server01 遠端電腦執行 Get-Culture 命令。

它會使用 ComputerName 參數指定電腦名稱,並使用 Credential 參數在 "Domain01\User01" (具有執行命令之權限的使用者) 的安全內容中執行命令。此外,它還會使用 ScriptBlock 參數指定要在遠端電腦執行的命令。

Windows PowerShell 會顯示對話方塊,要求 User01 帳戶的密碼與驗證方法,以示回應。接著,它會在 Server01 遠端電腦執行命令並傳回結果。





範例 3

C:\PS>$s = new-pssession -computername server02 -credential domain01\user01

C:\PS> invoke-command -session $s -scriptblock {get-culture}

描述
-----------
此範例會在 Server02 遠端電腦的工作階段 (固定連線) 中執行相同的 "Get-Culture" 命令。通常只有在遠端電腦執行一系列命令時,您才會建立工作階段。

第一個命令會使用 New-PSSession Cmdlet,在 Server02 遠端電腦建立工作階段,然後將工作階段儲存在 $s 變數中。

第二個命令會使用 Invoke-Command Cmdlet,在 Server02 執行 Get-Culture 命令,並使用 Session 參數指定儲存在 $s 變數中的工作階段。

Windows PowerShell 會在 Server02 電腦的工作階段中執行命令,以示回應。





範例 4

C:\PS>invoke-command -computername Server02 -scriptblock {$p = get-process powershell}

C:\PS> invoke-command -computername Server02 -scriptblock {$p.virtualmemorysize}
C:\PS>

C:\PS> $s = new-pssession -computername Server02
C:\PS> invoke-command -session $s -scriptblock {$p = get-process powershell}
C:\PS> invoke-command -session $s -scriptblock {$p.virtualmemorysize}
17930240

描述
-----------
這個範例會比較使用 Invoke-Command 之 ComputerName 和 Session 參數的效果。其中顯示如何使用工作階段,執行共用相同資料的一系列命令。

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

第一個命令執行成功,但第二個命令執行失敗,因為當您使用 ComputerName 參數時,Windows PowerShell 建立的連線只會執行命令,然後再於命令完成後關閉該連線。$p 變數是在一個連線中建立,但是在針對第二個命令所建立的連線中,這個變數並不存在。

解決這個問題的方法是在遠端電腦上建立工作階段 (固定連線),並在相同的工作階段中執行這兩個相關命令。

第三個命令會使用 New-PSSession Cmdlet,在 Server02 電腦建立工作階段,然後將工作階段儲存在 $s 變數中。第四和第五個命令會重複第一個集合中使用的一系列命令,但是這次 Invoke-Command 命令會使用 Session 參數,在相同的工作階段中執行這兩個命令。

這次由於兩個命令是在相同的工作階段中執行,因此命令會執行成功,而且 $p 值在 $s 工作階段中將持續作用,以供日後使用。





範例 5

C:\PS>$command = { get-eventlog -log "windows powershell" | where {$_.message -like "*certificate*"} }

C:\PS> invoke-command -computername S1, S2 -scriptblock $command

描述
-----------
在這個範例中,會示範如何輸入儲存在本機變數中的命令。

當整個命令都儲存在本機變數時,您可以指定該變數做為 ScriptBlock 參數的值。您不需要使用 "param" 關鍵字或 ArgumentList 變數來提交本機變數的值。

第一個命令會將 Get-Eventlog 命令儲存在 $command 變數中。這個命令的格式會做為指令碼區塊。

第二個命令會使用 Invoke-Command Cmdlet,在 S1 和 S2 遠端電腦執行 $command 中的命令。





範例 6

C:\PS>invoke-command -computername server01, server02, TST-0143, localhost -configurationname MySession.PowerShell -scriptblock {get-eventlog "windows powershell"}

描述
-----------
在這個範例中,會示範如何使用 Invoke-Command Cmdlet 在多部電腦執行單一命令。

此命令會使用 ComputerName 參數來指定這些電腦。這些電腦的名稱會以逗號分隔清單來呈現。電腦清單包括 "localhost" 值,代表本機電腦。

這個命令會使用 ConfigurationName 參數來指定 Windows PowerShell 的其他工作階段設定,並使用 ScriptBlock 參數來指定命令。

在這個範例中,指令碼區塊中的命令會取得每一部遠端電腦上 Windows PowerShell 事件記錄檔中的事件。





範例 7

C:\PS>$version = invoke-command -computername (get-content machines.txt) -scriptblock {(get-host).version}

描述
-----------
這個命令會取得在 200 部遠端電腦執行之 Windows PowerShell 主機的版本。

由於執行的命令只有一個,因此不需要建立與每一台電腦的固定連線 (工作階段)。所以,此命令會使用 ComputerName 參數來指定電腦。

這個命令會使用 Invoke-Command Cmdlet 來執行 Get-Host 命令,並使用點標記法取得 Windows PowerShell 主機的 Version 屬性。

為了指定電腦,它會使用 Get-Content Cmdlet 取得 Machine.txt 檔案 (電腦名稱的檔案) 的內容。

這些命令會同步執行 (一次執行一個)。當命令執行完畢後,所有電腦的命令輸出都會儲存在 $version 變數中。輸出中包括產生這些資料的來源電腦名稱。





範例 8

C:\PS>$s = new-pssession -computername Server01, Server02

C:\PS> invoke-command -session $s -scriptblock {get-eventlog system} -AsJob

Id   Name    State      HasMoreData   Location           Command
---  ----    -----      -----         -----------        --------             -------
1    Job1    Running    True          Server01,Server02  get-eventlog system


C:\PS> $j = Get-Job

C:\PS> $j | format-list -property *

HasMoreData   : True
StatusMessage :
Location      : Server01,Server02
Command       : get-eventlog system
JobStateInfo  : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : e124bb59-8cb2-498b-a0d2-2e07d4e030ca
Id            : 1
Name          : Job1
ChildJobs     : {Job2, Job3}
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}
StateChanged  :

C:\PS> $results = $j | Receive-Job

描述
-----------
這些命令會在兩部遠端電腦上執行背景工作。因為 Invoke-Command 命令會使用 AsJob 參數,所以雖然這些命令在遠端電腦上執行,不過工作實際上位於本機電腦,而且結果會傳送至本機電腦。

第一個命令會使用 New-PSSession Cmdlet,在 Server01 和 Server02 遠端電腦建立工作階段。

第二個命令會使用 Invoke-Command Cmdlet,在每個工作階段中執行背景工作。這個命令會使用 AsJob 參數,將命令當做背景工作來執行。它會傳回工作物件,其中包含兩個子工作物件,分別表示兩部遠端電腦執行的每一項工作。

第三個命令會使用 Get-Job 命令將工作物件儲存在 $j 變數中。

第四個命令會使用管線運算子 (|),將 $j 變數的值傳送至 Format-List Cmdlet,並由後者將此工作的所有屬性顯示在清單中。

第五個命令會取得工作的結果。它會經由管道,將 $j 中的工作物件輸出至 Receive-Job Cmdlet,並將結果儲存在 $results 變數中。





範例 9

C:\PS>$MWFO-LOg = Microsoft-Windows-Forwarding/Operational

C:\PS> invoke-command -computername server01 -scriptblock {param($log, $num) get-eventlog -logname $log -newest $num} -ArgumentList $MWFO-log, 10

描述
-----------
在這個範例中,會示範如何將本機變數的值加入在遠端電腦執行的命令中。

第一個命令會將 Microsoft-Windows-Forwarding/Operational 事件記錄檔的名稱儲存在 $MWFO-Log 變數中。

第二個命令會使用 Invoke-Command Cmdlet在 Server01 遠端電腦執行 Get-EventLog 命令,以便從 Server01 的 Microsoft-Windows-Forwarding/Operational 事件記錄檔中取得最新的 10 個事件。

這個命令會使用 "param" 關鍵字建立 $log 和 $num 兩個變數,做為 Get-EventLog 命令中的預留位置使用。這些預留位置具有任意名稱,不必符合提供其值之本機變數的名稱。

ArgumentList 參數的值示範兩種在引數清單中指定值的不同方法。$log 預留位置的值是在第一個命令中定義的 $MFWO-Log 變數。$num 變數的值是 10。

命令在傳送到遠端電腦之前,這些變數都會被取代成指定的值。





範例 10

C:\PS>invoke-command -computername S1, S2 -scriptblock {get-process powershell} 

PSComputerName    Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   ProcessName
--------------    -------  ------    -----      ----- -----   ------     --   -----------
S1                575      15        45100      40988   200     4.68     1392 powershell
S2                777      14        35100      30988   150     3.68     67   powershell


C:\PS> invoke-command -computername S1, S2 -scriptblock {get-process powershell} -HideComputerName

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   ProcessName
-------  ------    -----      ----- -----   ------     --   -----------
575      15        45100      40988   200     4.68     1392 powershell
777      14        35100      30988   150     3.68     67   powershell

描述
-----------
在這個範例中,會顯示使用 Invoke-Command 之 HideComputerName 參數的效果。

前兩個命令會使用 Invoke-Command Cmdlet 針對 PowerShell 處理序執行 Get-Process 命令。第一個命令的輸出包括 PsComputerName 屬性,而該屬性包含執行命令的電腦名稱。第二個命令會使用 HideComputerName 參數,其輸出並不包括 PsComputerName 一欄。

使用 HideComputerName 參數並不會變更物件。您仍然可以使用各項 Format Cmdlet,顯示所有受影響之物件的 PsComputerName 屬性。





範例 11

C:\PS>invoke-command -comp (get-content servers.txt) -filepath c:\scripts\sample.ps1 -argumentlist Process, Service

描述
-----------
這個範例會使用 Invoke-Command Cmdlet 在 Servers.txt 檔案列出的所有電腦執行 Sample.ps1 指令碼,並使用 FilePath 參數指定程式碼檔案。即使遠端電腦無法存取指令碼檔案,這個命令也可以讓您在遠端電腦執行指令碼。

提交命令時,便會將 Sample.ps1 檔案的內容複製到指令碼區塊中,而且此指令碼區塊會在每一部遠端電腦執行。這個程序相當於使用 ScriptBlock 參數提交指令碼的內容。





範例 12

C:\PS>$LiveCred = Get-Credential

C:\PS> Invoke-Command -ConfigurationName Microsoft.Exchange `
         -ConnectionUri https://ps.exchangelabs.com/powershell `
         -Credential $LiveCred  -Authentication Basic `
         -scriptblock {Invoke-Command {Set-Mailbox dan -DisplayName "Dan Park"}

描述
-----------
在這個範例中,會示範如何在 URI (網際網路位址) 所識別的遠端電腦執行命令。此特定範例會在遠端 Exchange 伺服器上執行 Set-Mailbox 命令。命令中的倒引號字元 (`) 是 Windows PowerShell 接續字元。

第一個命令會使用 Get-Credential Cmdlet,將 Windows Live ID 認證儲存在 $LiveCred 變數中。當認證對話方塊出現時,請輸入 Windows Live ID 認證。

第二個命令會使用 Invoke-Command Cmdlet 來執行 Set-Mailbox 命令,並使用 ConfigurationName 參數指定命令應該在使用 Microsoft.Exchange 工作階段設定的工作階段中執行、ConnectionURI 參數指定 Exchange 伺服器端點的 URL、

Credential 參數指定儲存在 $LiveCred 變數中的 Windows Live 認證、AuthenticationMechanism 參數指定使用基本驗證,以及 ScriptBlock 參數指定包含命令的指令碼區塊。





範例 13

C:\PS>$max = New-PSSessionOption -MaximumRedirection 1

C:\PS> Invoke-Command -ConnectionUri https://ps.exchangelabs.com/powershell `
         -scriptblock {Invoke-Command {Get-Mailbox dan} `
         -AllowRedirection -SessionOption $max

描述
-----------
這個命令會示範如何使用 AllowRedirection 和 SessionOption 參數,在遠端命令中管理 URI 重新導向。

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

第二個命令會使用 Invoke-Command Cmdlet,在執行 Microsoft Exchange Server 的遠端伺服器上執行 Get-Mailbox 命令。此外,這個命令會使用 AllowRedirection 參數提供明確權限,以便將連線重新導向到其他端點。它也會使用 SessionOption 參數來指定 $max 變數中的工作階段物件。

因此,如果 ConnectionURI 參數指定的遠端電腦傳回重新導向訊息,Windows PowerShell 會重新導向連線。但是如果新的目的地傳回其他重新導向訊息,便會超過重新導向計數值 1,而導致 Invoke-Command 傳回非終止錯誤。





範例 14

C:\PS>$so = New-PSSessionOption -SkipCACheck

PS C:\> invoke-command $s { get-hotfix } -SessionOption $so -credential server01\user01

描述
-----------
在這個範例中,會示範如何建立及使用 SessionOption 參數。

第一個命令會使用 New-PSSessionOption Cmdlet 建立工作階段選項,並會將產生的 SessionOption 物件儲存在 $so 參數中。

第二個命令會使用 Invoke-Command Cmdlet 從遠端執行 Get-Hotfix 命令。SessionOption 參數的值是 $so 變數中的 SessionOption 物件。





範例 15

C:\PS>enable-wsmanCredSSP -delegate server02

C:\PS> connect-wsman Server02

C:\PS> set-item wsman:\server02*\service\auth\credSSP -value $true

C:\PS> $s = new-pssession server02

C:\PS> invoke-command -session $s -script {get-item \\Net03\Scripts\LogFiles.ps1} -authentication credssp -credential domain01\admin01

描述
-----------
這個範例會示範如何從遠端工作階段內部存取網路共用。

此命令要求本機電腦的用戶端設定以及遠端電腦的服務設定都必須啟用 CredSSP 委派。若要執行這個範例中的命令,您必須是本機電腦和遠端電腦上 Administrators 群組的成員。

第一個命令會使用 Enable-WSManCredSSP Cmdlet 來啟用從 Server01 本機電腦到 Server02 遠端電腦的 CredSSP 委派。這個命令會設定本機電腦的 CredSSP 用戶端設定。

第二個命令會使用 Connect-WSman Cmdlet 來連線到 Server02 電腦。這個動作會將 Server02 電腦的節點新增至本機電腦的 WSMan: 磁碟機,讓您檢視和變更 Server02 電腦的 WS-Management 設定。

第三個命令會使用 Set-Item Cmdlet,將 Server02 電腦之 Service 節點中的 CredSSP 項目值變更為 True。這個動作會在遠端電腦的服務設定中啟用 CredSSP。

第四個命令會使用 New-PSSession Cmdlet,在 Server02 電腦上建立 PSSession,並將這個 PSSession 儲存在 $s 變數中。

第五個命令會使用 Invoke-Command Cmdlet,在 $s 的工作階段中執行 Get-Item 命令,以便從 Net03\Scripts 網路共用取得指令碼。此命令會使用 Credential 參數,而且它會使用 Authentication 參數搭配 CredSSP 值。





請參閱

概念

about_Remote
about_PSSessions
New-PSSession
Get-PSSession
Remove-PSSession
Enter-PSSession
Exit-PSSession
WSMan Provider