Invoke-Command
在本機和遠端電腦上執行命令。
語法
Invoke-Command
[-ScriptBlock] <ScriptBlock>
[-NoNewScope]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-Session] <PSSession[]>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-ScriptBlock] <ScriptBlock>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-Session] <PSSession[]>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-FilePath] <String>
[-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]
[-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]
[-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]
[-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]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
-Credential <PSCredential>
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-ScriptBlock] <ScriptBlock>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-VMId] <Guid[]>
[<CommonParameters>]
Invoke-Command
-Credential <PSCredential>
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-ScriptBlock] <ScriptBlock>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
-VMName <String[]>
[<CommonParameters>]
Invoke-Command
-Credential <PSCredential>
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-FilePath] <String>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-VMId] <Guid[]>
[<CommonParameters>]
Invoke-Command
-Credential <PSCredential>
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-FilePath] <String>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
-VMName <String[]>
[<CommonParameters>]
Invoke-Command
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-ScriptBlock] <ScriptBlock>
[-RunAsAdministrator]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
-ContainerId <String[]>
[<CommonParameters>]
Invoke-Command
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-FilePath] <String>
[-RunAsAdministrator]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
-ContainerId <String[]>
[<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。
某些程式代碼範例會使用曲線來減少行長。 如需詳細資訊,請參閱 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:使用會話來執行一系列共享數據的命令
此範例會比較 使用 ComputerName 和 Session 參數 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 計算機上建立持續性會話,並將會話儲存在變數中 $s
。 Invoke-Command
後續使用 Session 參數在相同會話中執行這兩個命令的行。 由於這兩個命令都會在相同的會話中執行,因此 $p
值會維持使用中狀態。
範例 5:使用儲存在變數中的腳本區塊叫用命令
此範例示範如何執行儲存為變數中腳本區塊的命令。 當文稿區塊儲存在變數中時,您可以將變數指定為 ScriptBlock 參數的值。
$command = {
Get-EventLog -LogName 'Windows PowerShell' |
Where-Object { $_.Message -like '*certificate*' }
}
Invoke-Command -ComputerName S1, S2 -ScriptBlock $command
變數 $command
會 Get-EventLog
儲存格式化為腳本區塊的命令。 會 Invoke-Command
執行儲存在 $command
S1 和 S2 遠端電腦上的命令。
範例 6:在數部計算機上執行單一命令
此範例示範如何使用 Invoke-Command
在多部計算機上執行單一命令。
$parameters = @{
ComputerName = 'Server01', 'Server02', 'TST-0143', 'localhost'
ConfigurationName = 'MySession.PowerShell'
ScriptBlock = { Get-EventLog 'Windows PowerShell' }
}
Invoke-Command @parameters
ComputerName 參數會指定以逗號分隔的計算機名稱清單。 計算機清單包含localhost值,代表本機電腦。 ConfigurationName 參數會指定替代會話組態。 ScriptBlock 參數會執行 Get-EventLog
以從每部計算機取得 Windows PowerShell 事件記錄檔。
範例 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_Variables 和 about_Scopes。
$Log = 'Windows PowerShell'
Invoke-Command -ComputerName Server01 -ScriptBlock {
Get-EventLog -LogName $Using:Log -Newest 10
}
變數 $Log
會儲存事件記錄檔 Windows PowerShell 的名稱。 Cmdlet 會在 Invoke-Command
Server01 上執行 Get-EventLog
,以從事件記錄檔取得十個最新的事件。 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
$param2
。 Get-ChildItem
會使用具名參數 Name 和 Include 搭配變數名稱。 ArgumentList 會將值傳遞至變數。
範例 12:在腳本區塊中使用$args自動變數
$args
自動變數和 ArgumentList 參數可用來將數位值傳遞至腳本區塊中的參數位置。 此範例會顯示伺服器的檔案目錄內容 .txt
。 Get-ChildItem
Path 參數是位置 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
Path 和 Filter 的參數位置。$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-Command
會使用 Microsoft.Exchange 會話組態來執行Set-Mailbox
命令。 ConnectionURI 參數會指定 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 重新導向
此範例示範如何使用 AllowRedirection 和 SessionOption 參數來管理遠端命令中的 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 物件的 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 = @{
Session = $s
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-WSManCredSSP
。 Role 參數會指定要在遠端電腦上設定 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。
參數
-AllowRedirection
允許將此連線重新導向至替代的統一資源標識碼(URI)。
當您使用 ConnectionURI 參數時,遠端目的地可以傳回指示以重新導向至不同的 URI。 根據預設,PowerShell 不會重新導向連線,但您可以使用此參數來允許它重新導向連線。
您也可以變更 MaximumConnectionRedirectionCount 會話選項值,以限制重新導向連線的次數。 使用 Cmdlet 的 New-PSSessionOption
MaximumRedirection 參數,或設定喜好設定變數的 $PSSessionOption
MaximumConnectionRedirectionCount 屬性。 預設值是 5。
類型: | SwitchParameter |
Position: | Named |
預設值: | False |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-ApplicationName
指定連線 URI 的應用程式名稱區段。 當您不使用 命令中的 ConnectionURI 參數時,請使用此參數來指定應用程式名稱。
預設值是本機電腦上的喜好設定變數值 $PSSessionApplicationName
。 如果未定義此喜好設定變數,預設值為 WSMAN。 此值適用於大部分使用。 如需詳細資訊,請參閱 about_Preference_Variables。
WinRM 服務會使用應用程式名稱來選取接聽程式以服務連線要求。 此參數的值應該符合 遠端電腦上接聽程式的 URLPrefix 屬性值。
類型: | String |
Position: | Named |
預設值: | $PSSessionApplicationName if set on the local computer, otherwise WSMAN |
必要: | False |
接受管線輸入: | True |
接受萬用字元: | False |
-ArgumentList
提供 scriptblock 的參數值。 腳本區塊中的參數會依提供給 ArgumentList的陣列值位置傳遞。 這稱為陣列展開。 如需 ArgumentList 行為的詳細資訊,請參閱about_Splatting。
類型: | Object[] |
別名: | Args |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-AsJob
指出此 Cmdlet 會在遠端電腦上以背景工作的形式執行命令。 使用此參數來執行需要大量時間才能完成的命令。
當您使用 AsJob 參數時,命令會傳回代表作業的物件,然後顯示命令提示字元。 您可以在作業完成時繼續在工作階段中工作。 若要管理作業,請使用 *-Job
Cmdlet。 若要取得作業結果,請使用 Receive-Job
Cmdlet。
AsJob 參數類似於使用 Invoke-Command
Cmdlet 從遠端執行 Start-Job
Cmdlet。 不過,使用 AsJob 時,即使作業是在遠端電腦上執行,還是會在本機電腦上建立作業。 遠端作業的結果會自動傳回至本機計算機。
如需PowerShell背景工作的詳細資訊,請參閱 about_Jobs 和 about_Remote_Jobs。
類型: | SwitchParameter |
Position: | Named |
預設值: | False |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-Authentication
指定用來驗證使用者認證的機制。 CredSSP 驗證僅適用於 Windows Vista、Windows Server 2008 和更新版本的 Windows 操作系統。
此參數可接受的值如下:
- 預設
- 基本
- Credssp
- Digest
- Kerberos
- 交涉
- NegotiateWithImplicitCredential
預設值為 Default。
如需此參數值的詳細資訊,請參閱 AuthenticationMechanism 列舉。
警告
認證安全性支援提供者 (CredSSP) 驗證,其中使用者的認證會傳遞至要驗證的遠端電腦,其設計訴求是在多個資源上要求驗證的命令,例如存取遠端網路共用。 此機制會增加遠端作業的安全性風險。 如果遠端電腦遭到入侵,傳遞給它的認證可用來控制網路會話。 如需詳細資訊,請參閱 認證安全性支援提供者。
類型: | AuthenticationMechanism |
接受的值: | Default, Basic, Negotiate, NegotiateWithImplicitCredential, Credssp, Digest, Kerberos |
Position: | Named |
預設值: | Default |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-CertificateThumbprint
指定具有連線到已中斷聯機會話之用戶帳戶的數位公鑰憑證 (X509)。 輸入憑證的憑證指紋。
憑證將用於用戶端憑證式驗證。 它們只能對應至本機用戶帳戶,而且無法與網域帳戶搭配使用。
若要取得憑證指紋,請在PowerShell憑證:磁碟驅動器中使用 Get-Item
或 Get-ChildItem
命令。
類型: | String |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-ComputerName
指定命令執行所在的計算機。 預設是本機電腦。
當您使用 ComputerName 參數時,PowerShell 會建立一個暫時連線,該連接只用來執行指定的命令,然後關閉。 如果您需要持續性連線,請使用 Session 參數。
在逗號分隔清單中,輸入一或多部計算機的NETBIOS名稱、IP 位址或完整域名。 若要指定本機計算機,請輸入計算機名稱、localhost 或點 (.
)。
若要在 ComputerName 值中使用 IP 位址,命令必須包含 Credential 參數。 計算機必須針對 HTTPS 傳輸進行設定,或遠端電腦的 IP 位址必須包含在本機電腦的 WinRM TrustedHosts 清單中。 如需將計算機名稱新增至 TrustedHosts 清單的指示,請參閱 如何將電腦新增至信任主機清單。
在 Windows Vista 和更新版本的 Windows 作業系統上,若要在 ComputerName 的值中包含本機電腦,您必須使用 [以系統管理員身分執行] 選項執行 PowerShell。
類型: | String[] |
別名: | Cn |
Position: | 0 |
預設值: | Local computer |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-ConfigurationName
指定用於新 PSSession 的會話組態。
輸入工作階段組態的組態名稱或完整資源URI。 如果您只指定組態名稱,則前面會加上下列架構 URI: http://schemas.microsoft.com/PowerShell
。
會話的會話組態位於遠端電腦上。 如果遠端電腦上沒有指定的工作階段組態,命令會失敗。
預設值是本機電腦上的喜好設定變數值 $PSSessionConfigurationName
。 如果未設定此喜好設定變數,則預設值為 Microsoft.PowerShell。 如需詳細資訊,請參閱 about_Preference_Variables。
類型: | String |
Position: | Named |
預設值: | $PSSessionConfigurationName if set on the local computer, otherwise Microsoft.PowerShell |
必要: | False |
接受管線輸入: | True |
接受萬用字元: | False |
-ConnectionUri
指定定義工作階段連接端點的統一資源識別碼 (URI)。 URI 必須完整。
此字串格式如下所示:
<Transport>://<ComputerName>:<Port>/<ApplicationName>
預設值如下:
http://localhost:5985/WSMAN
如果您未指定連線 URI,您可以使用 UseSSL 和 Port 參數來指定連線 URI 值。
URI 傳輸區段的有效值為 HTTP 和 HTTPS。 如果您使用傳輸區段指定連線 URI,但未指定埠,則會使用標準埠建立會話:80 代表 HTTP,而 HTTPS 則為 443。 若要使用PowerShell遠端的預設埠,請針對 HTTP 指定埠 5985,或針對 HTTPS 指定埠 5986。
如果目的地計算機將連線重新導向至不同的 URI,除非您在命令中使用 AllowRedirection 參數,否則 PowerShell 會防止重新導向。
類型: | Uri[] |
別名: | URI, CU |
Position: | 0 |
預設值: | http://localhost:5985/WSMAN |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-ContainerId
指定容器識別碼的陣列。
類型: | String[] |
Position: | Named |
預設值: | None |
必要: | True |
接受管線輸入: | True |
接受萬用字元: | False |
-Credential
指定具有執行此動作許可權的用戶帳戶。 預設為目前使用者。
輸入用戶名稱,例如User01或Domain01\User01,或輸入 Cmdlet 所產生的 Get-Credential
PSCredential 物件。 如果您輸入使用者名稱,系統會提示您輸入密碼。
認證會儲存在 PSCredential 物件中,密碼會儲存為 SecureString。
注意
如需 SecureString 數據保護的詳細資訊,請參閱 SecureString 有多安全?。
類型: | PSCredential |
Position: | Named |
預設值: | Current user |
必要: | False |
接受管線輸入: | True |
接受萬用字元: | False |
-EnableNetworkAccess
指出此 Cmdlet 會將互動式安全性令牌新增至回送會話。 互動式令牌可讓您在從其他電腦取得數據的回送會話中執行命令。 例如,您可以在會話中執行命令,將 XML 檔案從遠端電腦複製到本機電腦。
回送會話是一種 PSSession,源自同一部計算機並結束。 若要建立回送會話,請省略 ComputerName 參數,或將其值設定為 dot (.
)、localhost 或本機計算機的名稱。
根據預設,會使用網路令牌來建立回送會話,而網路令牌可能無法提供足夠的許可權來向遠端計算機進行驗證。
EnableNetworkAccess 參數只在回送會話中有效。 如果您在遠端電腦上建立會話時使用 EnableNetworkAccess ,命令會成功,但會忽略 參數。
您可以使用 Authentication 參數的 CredSSP 值,在回送會話中允許遠端訪問,以將會話認證委派給其他計算機。
為了防止計算機遭到惡意存取,只有使用 EnableNetworkAccess 建立的互動式令牌已中斷連線的回送會話,只能從建立會話的電腦重新連線。 使用 CredSSP 驗證的已中斷聯機會話可以從其他電腦重新連線。 如需詳細資訊,請參閱Disconnect-PSSession
。
此參數是在 PowerShell 3.0 中引進的。
類型: | SwitchParameter |
Position: | Named |
預設值: | False |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-FilePath
指定此 Cmdlet 在一或多個遠端電腦上執行的本機腳本。 輸入文稿的路徑和檔案名,或使用管線將文稿路徑傳送至 Invoke-Command
。 腳本必須存在於本機計算機上或本機計算機可以存取的目錄中。 使用 ArgumentList 指定文稿中的參數值。
當您使用此參數時,PowerShell 會將指定腳本檔案的內容轉換成腳本區塊、將腳本區塊傳輸到遠端電腦,並在遠端電腦上執行。
類型: | String |
別名: | PSPath |
Position: | 1 |
預設值: | None |
必要: | True |
接受管線輸入: | False |
接受萬用字元: | False |
-HideComputerName
指出這個 Cmdlet 會從輸出顯示中省略每個物件的電腦名稱。 根據預設,產生對象的計算機名稱會出現在顯示器中。
此參數只會影響輸出顯示。 它不會變更物件。
類型: | SwitchParameter |
別名: | HCN |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-InDisconnectedSession
指出此 Cmdlet 會在中斷連線的會話中執行命令或腳本。
當您使用 InDisconnectedSession 參數時,Invoke-Command
在每個遠端電腦上建立持續性會話、啟動 ScriptBlock 或 FilePath 參數指定的命令,然後中斷會話的連線。 命令會繼續在中斷連線的會話中執行。 InDisconnectedSession 可讓您執行命令,而不需維護遠端會話的連線。 而且,由於會話在傳回任何結果之前已中斷連線, InDisconnectedSession 可確保所有命令結果都會傳回至重新連線的會話,而不是在會話之間分割。
您無法搭配 Session 參數或 AsJob 參數使用 InDisconnectedSession。
使用 InDisconnectedSession 的命令會傳回 代表已中斷聯機會話的 PSSession 物件。 它們不會傳回命令輸出。 若要連線到已中斷連線的會話,請使用 Connect-PSSession
或 Receive-PSSession
Cmdlet。 若要取得在會話中執行的命令結果,請使用 Receive-PSSession
Cmdlet。 若要執行在中斷連線的會話中產生輸出的 命令,請將 OutputBufferingMode 會話選項的值設定為 Drop。 如果您想要連線到已中斷連線的會話,請在會話中設定閑置逾時,以便讓您在刪除會話之前有足夠的時間連線。
您可以在 SessionOption 參數或喜好設定變數中$PSSessionOption
設定輸出緩衝模式和閒置逾時。 如需會話選項的詳細資訊,請參閱 New-PSSessionOption
和 about_Preference_Variables。
如需中斷聯機會話功能的詳細資訊,請參閱 about_Remote_Disconnected_Sessions。
此參數是在 PowerShell 3.0 中引進的。
類型: | SwitchParameter |
別名: | Disconnected |
Position: | Named |
預設值: | False |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-InputObject
指定命令的輸入。 輸入包含 物件的變數,或輸入取得物件的命令或表達式。
使用 InputObject 參數時,請使用 $Input
ScriptBlock 參數值中的自動變數來代表輸入物件。
類型: | PSObject |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | True |
接受萬用字元: | False |
-JobName
指定背景作業的易記名稱。 根據預設,作業會命名 Job<n>
為 ,其中 <n>
是序數。
如果您在命令中使用 JobName 參數,此命令會以作業的形式執行,而且 Invoke-Command
會傳回作業物件,即使您未在 命令中包含 AsJob 也一樣。
如需PowerShell背景工作的詳細資訊,請參閱 about_Jobs。
類型: | String |
Position: | Named |
預設值: | Job<n> |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-NoNewScope
表示此 Cmdlet 會在目前範圍中執行指定的命令。 根據預設,會在 Invoke-Command
自己的範圍內執行命令。
此參數只在目前會話中執行的命令中有效,也就是省略 ComputerName 和 Session 參數的命令。
此參數是在 PowerShell 3.0 中引進的。
類型: | SwitchParameter |
Position: | Named |
預設值: | False |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | 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 參數。 命令中設定的埠會套用至命令執行所在的所有計算機或會話。 替代埠設定可能會防止命令在所有計算機上執行。
類型: | Int32 |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-RunAsAdministrator
指出此 Cmdlet 會以系統管理員身分叫用命令。
類型: | SwitchParameter |
Position: | Named |
預設值: | False |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-ScriptBlock
指定要執行的命令。 以大括弧 ({ }
) 括住命令,以建立腳本區塊。 使用 Invoke-Command
遠端執行命令時,會在遠端電腦上評估命令中的任何變數。
注意
scriptblock 的參數只能依位置從 ArgumentList 傳入。 參數無法依位置傳遞。 如果您需要類似 SwitchParameter 類型的參數,請改用 布爾 型別。
類型: | ScriptBlock |
別名: | Command |
Position: | 0 |
預設值: | None |
必要: | True |
接受管線輸入: | False |
接受萬用字元: | False |
-Session
指定此 Cmdlet 執行命令的工作階段陣列。 輸入包含 PSSession 物件的變數,或建立或取得 PSSession 物件的命令,例如 New-PSSession
或 Get-PSSession
命令。
當您建立 PSSession 時,PowerShell 會建立與遠端電腦的持續性連線。 使用 PSSession 來執行一系列共享數據的相關命令。 若要執行單一命令或一系列不相關的命令,請使用 ComputerName 參數。 如需詳細資訊,請參閱 about_PSSessions。
類型: | PSSession[] |
Position: | 0 |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-SessionName
指定已中斷連線之會話的易記名稱。 您可以使用名稱來參考後續命令中的工作階段,例如 Get-PSSession
命令。 此參數僅適用於 InDisconnectedSession 參數。
此參數是在 PowerShell 3.0 中引進的。
類型: | String[] |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-SessionOption
指定工作階段的進階選項。 輸入 SessionOption 物件,例如您使用 Cmdlet 建立New-PSSessionOption
的物件,或索引鍵是會話選項名稱的哈希表,而值是會話選項值。
注意
如果您為 SessionOption 指定哈希表,PowerShell 會將哈希表轉換成 System.Management.Automation.Remoting.PSSessionOption 物件。 哈希表中指定的索引鍵值會轉換成 物件的相符屬性。 這的行為與呼叫 New-PSSessionOption
的方式不同。 例如, Timeout 屬性的 System.TimeSpan 值,例如 IdleTimeout,會將整數值轉換成刻度,而不是毫秒。
如需 PSSessionOption 物件及其屬性的詳細資訊,請參閱 PSSessionOption
如果設定選項,選項的 $PSSessionOption
預設值取決於喜好設定變數的值。 否則,預設值是由會話組態中設定的選項所建立。
會話選項值優先於喜好設定變數和會話組態中 $PSSessionOption
設定之會話的預設值。 不過,它們不會優先於會話設定中設定的最大值、配額或限制。
如需包含預設值的工作階段選項描述,請參閱 New-PSSessionOption
。 如需喜好設定變數的相關信息 $PSSessionOption
,請參閱 about_Preference_Variables。 如需工作階段設定的詳細資訊,請參閱 about_Session_Configurations。
類型: | PSSessionOption |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-ThrottleLimit
指定可以建立以執行此命令的並行連線數目上限。 如果您省略此參數或輸入 0 值,則會使用預設值 32。
節流限制僅適用於目前的命令,不適用於會話或計算機。
類型: | Int32 |
Position: | Named |
預設值: | 32 |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-UseSSL
指出此 Cmdlet 會使用安全套接字層 (SSL) 通訊協定來建立與遠端電腦的連線。 根據預設,不會使用 SSL。
WS-Management 會加密透過網路傳輸的所有 PowerShell 內容。 UseSSL 參數是額外的保護,可跨 HTTPS 傳送數據,而不是 HTTP。
如果您使用此參數,但在用於命令的埠上無法使用 SSL,命令會失敗。
類型: | SwitchParameter |
Position: | Named |
預設值: | False |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-VMId
指定虛擬機的識別碼陣列。
類型: | Guid[] |
別名: | VMGuid |
Position: | 0 |
預設值: | None |
必要: | True |
接受管線輸入: | True |
接受萬用字元: | False |
-VMName
指定虛擬機名稱的陣列。
類型: | String[] |
Position: | Named |
預設值: | None |
必要: | True |
接受管線輸入: | True |
接受萬用字元: | False |
輸入
您可以使用管線將文稿區塊中的命令傳送至 Invoke-Command
。 $Input
使用自動變數來表示命令中的輸入物件。
輸出
System.Management.Automation.PSRemotingJob
如果您使用 AsJob 參數,此 Cmdlet 會傳回作業物件。
如果您使用 InDisconnectedSession 參數,此 Cmdlet 會 傳回 PSSession 物件。
根據預設,此 Cmdlet 會傳回叫用命令的輸出,這是 ScriptBlock 參數的值。
備註
Windows 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。