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>
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-ScriptBlock] <ScriptBlock>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-VMGuid] <Guid[]>
[<CommonParameters>]
Invoke-Command
-Credential <PSCredential>
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-ScriptBlock] <ScriptBlock>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
-VMName <String[]>
[<CommonParameters>]
Invoke-Command
-Credential <PSCredential>
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-FilePath] <String>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-VMGuid] <Guid[]>
[<CommonParameters>]
Invoke-Command
-Credential <PSCredential>
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-FilePath] <String>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
-VMName <String[]>
[<CommonParameters>]
Description
Invoke-Command
Cmdlet 會在本機或遠端電腦上執行命令,並傳回命令的所有輸出,包括錯誤。 您可以使用單一 Invoke-Command
命令,在多部計算機上執行命令。
若要在遠端電腦上執行單一命令,請使用 ComputerName 參數。 若要執行一系列共享數據的相關命令,請使用 New-PSSession
Cmdlet 在遠端電腦上建立 PSSession (持續性連線),然後使用 Invoke-Command
的 Session 參數,在 PSSession中執行命令。 若要在中斷連線的會話中執行命令,請使用 InDisconnectedSession 參數。 若要在背景作業中執行命令,請使用 AsJob 參數。
您也可以在本機計算機上將 Invoke-Command
當做命令使用腳本區塊。 PowerShell 會立即在目前範圍的子範圍中執行腳本區塊。
在使用 Invoke-Command
在遠端電腦上執行命令之前,請先讀取 about_Remote。
某些程式代碼範例會使用曲線來減少行長。 如需詳細資訊,請參閱 about_Splatting。
範例
範例 1:在伺服器上執行腳本
此範例會在 Server01 計算機上執行 Test.ps1
腳本。
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}
New-PSSession
Cmdlet 會在 Server02 遠端電腦上建立工作階段,並將它儲存在 $s
變數中。 一般而言,只有在遠端電腦上執行一系列命令時,才會建立會話。
Invoke-Command
Cmdlet 會在 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
變數是在一個連接中建立的,但它不存在於為第二個命令建立的連線中。
此問題可藉由在遠端電腦上建立持續性會話,然後在相同的會話中執行這兩個命令來解決。
New-PSSession
Cmdlet 會在 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
會執行儲存在 S1 和 S2 遠端電腦上的 $command
命令。
範例 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 檔案的內容,也就是計算機名稱的檔案。
Invoke-Command
Cmdlet 會在遠端電腦上執行 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
New-PSSession
Cmdlet 會在 Server01 和 Server02 遠端電腦上建立會話。
Invoke-Command
Cmdlet 會在每個工作中執行背景工作。 此命令會使用 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 的名稱。
Invoke-Command
Cmdlet 會在 Server01 上執行 Get-EventLog
,以從事件記錄檔取得十個最新的事件。
LogName 參數的值是 $Log
變數,其前置詞是 Using
範圍修飾詞,指出它是在本機會話中建立的,而不是在遠端會話中建立。
範例 10:隱藏計算機名稱
此範例顯示使用 Invoke-Command
HideComputerName 參數的效果。
HideComputerName 不會變更此 Cmdlet 傳回的物件。 它只會變更顯示。 您仍然可以使用 Format Cmdlet 來顯示任何受影響物件的 PsComputerName 屬性。
Invoke-Command -ComputerName S1, S2 -ScriptBlock {Get-Process PowerShell}
PSComputerName Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
-------------- ------- ------ ----- ----- ----- ------ -- -----------
S1 575 15 45100 40988 200 4.68 1392 PowerShell
S2 777 14 35100 30988 150 3.68 67 PowerShell
Invoke-Command -ComputerName S1, S2 -ScriptBlock {Get-Process PowerShell} -HideComputerName
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
575 15 45100 40988 200 4.68 1392 PowerShell
777 14 35100 30988 150 3.68 67 PowerShell
前兩個命令會使用 Invoke-Command
來執行 PowerShell 程式的 Get-Process
命令。 第一個命令的輸出包含 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
會使用具名參數、名稱 和 包含變數名稱。
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 會將 $args
陣列值傳遞至 Path 和 FilterGet-ChildItem
參數位置。
範例 13:在文本檔中列出的所有計算機上執行腳本
此範例會使用 Invoke-Command
Cmdlet,在 Servers.txt
檔案中列出的所有電腦上執行 Sample.ps1
腳本。 命令會使用 FilePath 參數來指定腳本檔案。 此命令可讓您在遠端電腦上執行腳本,即使遠端電腦無法存取腳本檔案也一樣。
Invoke-Command -ComputerName (Get-Content Servers.txt) -FilePath C:\Scripts\Sample.ps1 -ArgumentList Process, Service
當您提交命令時,Sample.ps1
檔案的內容會複製到腳本區塊中,而且腳本區塊會在每部遠端計算機上執行。 此程式相當於使用 ScriptBlock 參數來提交腳本的內容。
範例 14:使用 URI 在遠端電腦上執行命令
此範例示範如何在統一資源標識碼 (URI) 所識別的遠端電腦上執行命令。 這個特定範例會在遠端 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 的參數。
Invoke-Command
Cmdlet 會使用 Microsoft.Exchange 會話組態來執行 Set-Mailbox
命令。
ConnectionURI 參數會指定 Exchange 伺服器端點的 URL。
Credential 參數會指定儲存在 $LiveCred
變數中的認證。
AuthenticationMechanism 參數會指定基本身份驗證的使用方式。
ScriptBlock 參數會指定包含 命令的腳本區塊。
範例 15:使用會話選項
此範例示範如何建立及使用 SessionOption 參數。
$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
Invoke-Command -ComputerName server01 -UseSSL -ScriptBlock { Get-HotFix } -SessionOption $so -Credential server01\user01
New-PSSessionOption
Cmdlet 會建立工作階段選項物件,讓遠端端在評估傳入 HTTPS 連線時,不會驗證證書頒發機構單位、標準名稱和撤銷清單。
SessionOption 物件會儲存在 $so
變數中。
注意
停用這些檢查很方便進行疑難解答,但顯然不安全。
Invoke-Command
Cmdlet 會從遠端執行 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
New-PSSessionOption
Cmdlet 會建立儲存在 $max
變數中的 PSSessionOption 物件。 此命令會使用 MaximumRedirection 參數,將 PSSessionOption 物件的 MaximumConnectionRedirectionCount 屬性設定為 1。
Invoke-Command
Cmdlet 會在遠端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
Enable-WSManCredSSP
Cmdlet 會啟用從 Server01 本機電腦到 Server02 遠端電腦的 CredSSP 委派。
Role 參數會指定 Client 在本機電腦上設定 CredSSP 用戶端設定。
New-PSSession
會為 Server02 建立 PSSession 物件,並將物件儲存在 $s
變數中。
Invoke-Command
Cmdlet 會使用 $s
變數來連線到遠端電腦 Server02。
ScriptBlock 參數會在遠端電腦上執行 Enable-WSManCredSSP
。
Role 參數會指定 Server,以在遠端電腦上設定 CredSSP 伺服器設定。
$parameters
變數包含連線到網路共享的參數值。
Invoke-Command
Cmdlet 會在 $s
的工作階段中執行 Get-Item
命令。 此命令會從 \\Net03\Scripts
網路共用取得腳本。 此命令會使用 Authentication 參數搭配 CredSSP 值,以及值為 Domain01\Admin01的 Credential 參數。
範例 18:在許多遠端電腦上啟動腳本
此範例會在一百多部計算機上執行腳本。 為了將本機計算機的影響降到最低,它會連線到每部計算機、啟動腳本,然後與每部計算機中斷連線。 腳本會繼續在中斷連線的會話中執行。
$parameters = @{
ComputerName = (Get-Content -Path C:\Test\Servers.txt)
InDisconnectedSession = $true
FilePath = "\\Scripts\Public\ConfigInventory.ps1"
SessionOption = @{OutputBufferingMode="Drop";IdleTimeout=43200000}
}
Invoke-Command @parameters
命令會使用 Invoke-Command
來執行腳本。
ComputerName 參數的值是 Get-Content
命令,可從文本檔取得遠端電腦的名稱。
InDisconnectedSession 參數會在啟動命令時立即中斷會話的連線。
FilePath 參數的值是 Invoke-Command
在每個電腦上執行的腳本。
sessionOption
若要取得在中斷聯機會話中執行的命令和腳本結果,請使用 Receive-PSSession
Cmdlet。
參數
-AllowRedirection
允許將此連線重新導向至替代的統一資源標識碼(URI)。
當您使用 ConnectionURI 參數時,遠端目的地可以傳回指示以重新導向至不同的 URI。 根據預設,PowerShell 不會重新導向連線,但您可以使用此參數來允許它重新導向連線。
您也可以變更 MaximumConnectionRedirectionCount 會話選項值,來限制重新導向連線的次數。 使用 New-PSSessionOption
Cmdlet 的 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
提供命令中局部變數的值。 在遠端電腦上執行命令之前,命令中的變數會由這些值取代。 在逗號分隔清單中輸入值。 值會依照變數列出的順序與變數相關聯。 ArgumentList 的別名為 Args。
ArgumentList 參數中的值可以是實際值,例如 1024,也可以參考局部變數,例如 $max
。
若要在命令中使用局部變數,請使用下列命令格式:
{param($<name1>[, $<name2>]...) <command-with-local-variables>} -ArgumentList <value>
-或- <local-variable>
參數 關鍵詞會列出命令中使用的局部變數。 ArgumentList 會依照變數列出的順序提供變數的值。
類型: | 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
- 消化
- 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 作業系統上,若要將本機電腦包含在
類型: | String[] |
別名: | Cn |
Position: | 0 |
預設值: | Local computer |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-ConfigurationName
指定用於新 PSSession的會話組態。
輸入工作階段組態的組態名稱或完整資源URI。 如果您只指定組態名稱,則前面會加上下列架構 URI:https://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>
預設值如下:
https://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 |
預設值: | https://localhost:5985/WSMAN |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-Credential
指定具有執行此動作許可權的用戶帳戶。 預設值為目前的使用者。
輸入用戶名稱,例如User01或Domain01\User01。 或者,輸入 PSCredential 物件,例如 Get-Credential
Cmdlet 所產生的物件。 如果您輸入使用者名稱,此 Cmdlet 會提示您輸入密碼。
類型: | PSCredential |
Position: | Named |
預設值: | Current user |
必要: | False |
接受管線輸入: | True |
接受萬用字元: | False |
-EnableNetworkAccess
指出此 Cmdlet 會將互動式安全性令牌新增至回送會話。 互動式令牌可讓您在從其他電腦取得數據的回送會話中執行命令。 例如,您可以在會話中執行命令,將 XML 檔案從遠端電腦複製到本機電腦。
回送會話是 來自相同電腦上的 PSSession。 若要建立回送會話,請省略 ComputerName 參數,或將其值設定為 dot (.
)、localhost 或本機計算機的名稱。
根據預設,會使用網路令牌來建立回送會話,而網路令牌可能無法提供足夠的許可權來向遠端計算機進行驗證。
EnableNetworkAccess 參數只在回送會話中有效。 如果您在遠端電腦上建立會話時,使用 EnableNetworkAccess,命令會成功,但會忽略 參數。
您可以使用 CredSSPAuthentication 參數的值,將會話認證委派給其他計算機,以允許回送會話會話中的遠端訪問。
若要保護計算機免於惡意存取,具有互動式令牌的已中斷聯機回送會話,這些會話是使用 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 參數時,請使用 ScriptBlock 參數值中的 $Input
自動變數來表示輸入物件。
類型: | 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 |
-ScriptBlock
指定要執行的命令。 以大括弧括住命令,{ }
以建立腳本區塊。
這是必要參數。
根據預設,命令中的任何變數都會在遠端計算機上進行評估。 若要在命令中包含局部變數,請使用 ArgumentList。
類型: | 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 物件,例如您使用 New-PSSessionOption
Cmdlet 建立的工作階段選項名稱,以及值是會話選項值的哈希表。
選項的預設值取決於設定 $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[] |
Position: | 0 |
預設值: | None |
必要: | True |
接受管線輸入: | True |
接受萬用字元: | False |
-VMName
指定虛擬機名稱的陣列。
類型: | String[] |
Position: | Named |
預設值: | None |
必要: | True |
接受管線輸入: | True |
接受萬用字元: | False |
輸入
您可以使用管線在文稿區塊中傳送命令,以 Invoke-Command
。 使用 $Input
自動變數來表示命令中的輸入物件。
輸出
System.Management.Automation.PSRemotingJob, System.Management.Automation.Runspaces.PSSession, or the output of the invoked command
如果您使用 AsJob 參數,此 Cmdlet 會傳回作業物件。 如果您指定 InDisconnectedSession 參數,Invoke-Command
會傳回 PSSession 物件。 否則,它會傳回叫用命令的輸出,這是 ScriptBlock 參數的值。
備註
在 Windows Vista 和更新版本的 Windows 作業系統上,若要使用
當您在多部計算機上執行命令時,PowerShell 會以清單顯示的順序連接到電腦。 不過,命令輸出會依從遠端電腦接收的順序顯示,這可能不同。
命令結果中包含 Invoke-Command
執行命令所產生的錯誤。
本機命令中將終止錯誤的錯誤視為遠端命令中的非終止錯誤。 此策略可確保在一部計算機上終止錯誤不會在執行它的所有計算機上關閉命令。 即使在單一計算機上執行遠端命令時,也會使用這個做法。
如果遠端電腦不在本機電腦信任的網域中,計算機可能無法驗證用戶的認證。 若要將遠端電腦新增至 WS-Management 中受信任的主機清單,請在 WSMAN
提供者中使用下列命令,其中 <Remote-Computer-Name>
是遠端電腦的名稱:
Set-Item -Path WSMan:\Localhost\Client\TrustedHosts -Value \<Remote-Computer-Name\>
當您使用 InDisconnectedSession 參數中斷 PSSession時,工作階段狀態 已中斷連線,而且可用性 None。 State 屬性的值相對於目前的會話。 已中斷連線 值表示 PSSession 未連線到目前的會話。 不過,這並不表示 PSSession 與所有會話中斷連線。 它可能會連線到不同的會話。 若要判斷您是否可以連線或重新連線到會話,請使用 Availability 屬性。
Availability 值 None 表示您可以連線到會話。 Busy 的值表示您無法連線到 PSSession,因為它已連線到另一個會話。 如需工作階段 State 屬性之值的詳細資訊,請參閱 runspaceState 。 如需會話之 Availability 屬性值的詳細資訊,請參閱 runspaceAvailability 。