共用方式為


ForEach-Object

針對輸入物件集合中的每個項目執行作業。

語法

ScriptBlockSet (預設值)

ForEach-Object
    [-Process] <ScriptBlock[]>
    [-InputObject <PSObject>]
    [-Begin <ScriptBlock>]
    [-End <ScriptBlock>]
    [-RemainingScripts <ScriptBlock[]>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]

PropertyAndMethodSet

ForEach-Object
    [-MemberName] <String>
    [-InputObject <PSObject>]
    [-ArgumentList <Object[]>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]

ParallelParameterSet

ForEach-Object
    -Parallel <ScriptBlock>
    [-InputObject <PSObject>]
    [-ThrottleLimit <Int32>]
    [-TimeoutSeconds <Int32>]
    [-AsJob]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]

Description

ForEach-Object Cmdlet 會在輸入物件集合中的每個項目上執行作業。 輸入物件可以使用管線傳送至 Cmdlet,或使用 InputObject 參數來指定。

從 Windows PowerShell 3.0 開始,有兩種不同的方法來建構 ForEach-Object 命令。

  • 文稿區塊。 您可以使用文稿區塊來指定作業。 在腳本區塊內,使用 $_ 變數來表示目前的物件。 腳本區塊是 Process 參數的值。 腳本區塊可以包含任何 PowerShell 腳本。

    例如,下列命令會取得計算機上每個進程的 ProcessName 屬性值。

    Get-Process | ForEach-Object {$_.ProcessName}

    ForEach-Object 支援 beginprocessend 區塊,如 about_functions中所述。

    備註

    腳本區塊會在呼叫端的範圍中執行。 因此,這些塊可以訪問該作用域中的變數,並且可以創建在 cmdlet 完成後保留在該作用域中的新變數。

  • Operation 語句。 您也可以撰寫作業語句,這更像是自然語言。 您可以使用 operation 語句來指定屬性值或呼叫方法。 作業語句是在 Windows PowerShell 3.0 中引進的。

    例如,下列命令也會取得計算機上每個進程的 ProcessName 屬性值。

    Get-Process | ForEach-Object ProcessName

  • 平行執行腳本區塊。 從 PowerShell 7.0 開始,可以使用第三個參數集平行執行每個腳本區塊。 ThrottleLimit 參數會限制一次執行的平行腳本數目。 和之前一 $_ 樣,使用 變數來代表腳本區塊中的目前輸入物件。 使用 $using: 關鍵詞,將變數參考傳遞至執行中的腳本。

    在 PowerShell 7 中,會為每個循環反覆專案建立新的 Runspace,以確保隔離上限。 相較於建立新的 Runspace,或執行大量反覆項目執行大量工作,這可以是大型效能和資源命中。 從 PowerShell 7.1 開始,Runspace 集區中的 Runspace 預設會重複使用。 運行空間池大小由 ThrottleLimit 參數指定。 預設 Runspace 集區大小為 5。 您仍然可以使用 UseNewRunspace 參數為每個反覆專案建立新的 Runspace。

    根據預設,平行腳本區塊會使用啟動平行工作的呼叫端目前工作目錄。

    如需詳細資訊,請參閱本文的 NOTES 一節。

範例

範例 1:在陣列中除整數

此範例會採用三個整數的數位,並將其中每個整數除以 1024。

30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625

範例 2:取得目錄中所有檔案的長度

這個範例會處理 PowerShell 安裝目錄中的檔案和目錄,$PSHOME

Get-ChildItem $PSHOME |
  ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}

如果物件不是目錄,腳本區塊會取得檔案的名稱、將 Length 屬性的值除以 1024,並新增空格 (“ ”) 以將其與下一個專案分開。 Cmdlet 會使用 PSISContainer 屬性來判斷物件是否為目錄。

範例 3:在最近的系統事件上作

這個範例會將 1000 個最新的事件從系統事件記錄檔寫入文字檔。 目前的時間會顯示在處理事件之前和之後。

$Events = Get-EventLog -LogName System -Newest 1000
$events | ForEach-Object -Begin {Get-Date} -Process {Out-File -FilePath Events.txt -Append -InputObject $_.Message} -End {Get-Date}

Get-EventLog 從系統事件日誌中獲取 1000 個最新事件,並將它們存儲在變數中 $Events$Events 然後通過管道傳輸到 ForEach-Object cmdlet。 Begin 參數會顯示目前的日期和時間。 接下來,Process 參數會使用 Out-File Cmdlet 來建立名為 events.txt 的文本檔,並將每個事件的訊息屬性儲存在該檔案中。 最後,End 參數是用來顯示所有處理完成之後的日期和時間。

範例 4:變更登錄機碼的值

此示例將鍵下所有子項中的 HKCU:\Network 註冊表項值更改為大寫文本。

Get-ItemProperty -Path HKCU:\Network\* |
  ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}

您可以使用此格式來變更登錄專案值的表單或內容。

網路金鑰中的每個子機碼代表在登入時重新連線的對應網路驅動器機。 RemotePath 專案包含已連線磁碟驅動器的 UNC 路徑。 例如,如果將 E: 驅動器映射到 \\Server\Share,則會在 中HKCU:\Network創建一個 E 子項,並將 RemotePath 註冊表值設定為 \\Server\Share

此命令會使用 Get-ItemProperty Cmdlet 來取得 Network 機碼和 Set-ItemProperty Cmdlet 的所有子機碼,以變更每個機碼中 RemotePath 登錄專案的值。 在命令中 Set-ItemProperty ,路徑是登錄機碼 的 PSPath 屬性值。 這是Microsoft .NET Framework 對象的屬性,代表登錄機碼,而不是登錄專案。 此命令會使用 RemotePath 值的 ToUpper() 方法,也就是字串 (REG_SZ)。

因為 Set-ItemProperty 變更每個索引鍵的 屬性,因此需要 ForEach-Object Cmdlet 才能存取 屬性。

範例 5:使用$Null自動變數

此範例顯示將 $Null 自動變數管線傳送至 ForEach-Object Cmdlet 的效果。

1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello

因為 PowerShell 會將 null 視為明確的佔位符,所以 ForEach-Object Cmdlet 會產生 $Null的值,就像您傳送至它的其他對象一樣。

範例 6:取得屬性值

此示例使用 cmdlet 的 MemberName 參數獲取所有已安裝 PowerShell 模組的 ForEach-Object 屬性的值。

Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path

第二個命令相當於第一個命令。 它會使用 Foreach Cmdlet 的 ForEach-Object 別名,並省略 MemberName 參數的名稱,這是選擇性的。

ForEach-Object Cmdlet 對於取得屬性值很有用,因為它會取得值而不變更類型,不同於 Format Cmdlet 或 Select-Object Cmdlet,這會變更屬性值類型。

範例 7:將模組名稱分割成元件名稱

此範例示範三種方式可將兩個點分隔的模組名稱分割成其元件名稱。 命令會呼叫字串的 Split 方法。 這三個命令使用不同的語法,但它們是相等且可互換的。 這三個案例的輸出都相同。

"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object {$_.Split(".")}
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object -MemberName Split -ArgumentList "."
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | Foreach Split "."
Microsoft
PowerShell
Core
Microsoft
PowerShell
Host

第一個命令會使用傳統語法,其中包含腳本區塊和目前的物件運算子 $_。 它會使用點語法來指定方法及括弧來括住分隔符自變數。

第二個命令會使用 MemberName 參數來指定 Split 方法和 ArgumentList 參數,以識別點 (.) 做為分割分隔符。

第三個命令會使用 Cmdlet 的 ForEach-Object 別名,並省略 MemberNameArgumentList 參數的名稱,這是選擇性參數。

範例 8:搭配兩個腳本區塊使用 ForEach-Object

在此範例中,我們會以位置傳遞兩個腳本區塊。 所有腳本區塊都會系結至 Process 參數。 但是,它們被視為已傳遞給 BeginProcess 參數。

1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process

範例 9:搭配兩個以上的腳本區塊使用 ForEach-Object

在此範例中,我們會以位置傳遞兩個腳本區塊。 所有腳本區塊都會系結至 Process 參數。 但是,它們被視為已傳遞給 BeginProcessEnd 參數。

1..2 | ForEach-Object { 'begin' } { 'process A' }  { 'process B' }  { 'end' }
begin
process A
process B
process A
process B
end

備註

第一個腳本塊始終映射到塊, begin 最後一個塊映射到塊 end ,中間的塊都映射到塊 process

範例 10:針對每個管線專案執行多個腳本區塊

如上一個範例所示,使用 Process 參數傳遞的多個腳本區塊會對應至 BeginEnd 參數。 若要避免此對應,您必須提供 BeginEnd 參數的明確值。

1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three

範例 11:以平行批次執行慢速腳本

此示例運行一個簡單的腳本塊,該塊計算字串並休眠一秒鐘。

$Message = "Output:"

1..8 | ForEach-Object -Parallel {
    "$using:Message $_"
    Start-Sleep 1
} -ThrottleLimit 4
Output: 1
Output: 2
Output: 3
Output: 4
Output: 5
Output: 6
Output: 7
Output: 8

ThrottleLimit 參數值設定為 4,以便以四個批次處理輸入。 $using: 關鍵詞可用來將 $Message 變數傳遞至每個平行腳本區塊。

範例 12:平行擷取記錄專案

此範例會從本機 Windows 電腦上的 5 個系統記錄檔擷取 50,000 個記錄專案。

$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'

$logEntries = $logNames | ForEach-Object -Parallel {
    Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5

$logEntries.Count
50000

Parallel 參數會指定針對每個輸入記錄檔名稱平行執行的腳本區塊。 ThrottleLimit 參數可確保所有五個腳本區塊都會同時執行。

範例 13:以作業的形式平行執行

此示例並行運行一個簡單的腳本塊,一次創建兩個後台作業。

$job = 1..10 | ForEach-Object -Parallel {
    "Output: $_"
    Start-Sleep 1
} -ThrottleLimit 2 -AsJob

$job | Receive-Job -Wait
Output: 1
Output: 2
Output: 3
Output: 4
Output: 5
Output: 6
Output: 7
Output: 8
Output: 9
Output: 10

$job 變數接收收集輸出數據並監控運行狀態的作業物件。 作業物件通過管道連接到 Receive-Job等待」 開關參數。 這會將輸出流式傳輸到控制台,就像在沒有 AsJob 的情況下運行一樣ForEach-Object -Parallel

範例 14:使用線程安全變數參考

此範例會平行叫用腳本區塊,以收集唯一命名的 Process 物件。

$threadSafeDictionary = [System.Collections.Concurrent.ConcurrentDictionary[string,object]]::new()
Get-Process | ForEach-Object -Parallel {
    $dict = $using:threadSafeDictionary
    $dict.TryAdd($_.ProcessName, $_)
}

$threadSafeDictionary["pwsh"]
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     82    82.87     130.85      15.55    2808   2 pwsh

ConcurrentDictionary 物件的單一實例會傳遞至每個腳本區塊以收集物件。 由於 ConcurrentDictionary 是線程安全的,因此每個並行腳本可以安全地修改它。 非線程安全物件,例如 System.Collections.Generic.Dictionary,在這裡無法使用。

備註

此示例是 Parallel 參數的使用效率非常低。 該文本只是將輸入物件添加到併發字典物件。 這是微不足道的,不值得在單獨的線程中調用每個腳本的開銷。 在沒有並行開關的情況下正常運行ForEach-Object會更高效、更快捷。 此範例僅供示範如何使用線程安全變數。

範例 15:撰寫平行執行的錯誤

這個範例會以平行方式寫入錯誤數據流,其中寫入錯誤的順序是隨機的。

1..3 | ForEach-Object -Parallel {
    Write-Error "Error: $_"
}
Write-Error: Error: 1
Write-Error: Error: 3
Write-Error: Error: 2

範例 16:在平行執行中終止錯誤

此範例示範一個平行執行腳本區塊中的終止錯誤。

1..5 | ForEach-Object -Parallel {
    if ($_ -eq 3)
    {
        throw "Terminating Error: $_"
    }

    Write-Output "Output: $_"
}
Exception: Terminating Error: 3
Output: 1
Output: 4
Output: 2
Output: 5

Output: 3 永遠不會寫入,因為該反覆運算的平行腳本區塊已終止。

備註

PipelineVariable 一般參數變數 $using: 支援。

範例 17:在巢狀平行腳本 ScriptBlockSet 中傳遞變數

您可以在 Foreach-Object -Parallel 範圍腳本區塊之外建立變數,並在 scriptblock 內搭配 $using 關鍵詞使用。

$test1 = 'TestA'
1..2 | Foreach-Object -Parallel {
    $using:test1
}
TestA
TestA
# You CANNOT create a variable inside a scoped scriptblock
# to be used in a nested foreach parallel scriptblock.
$test1 = 'TestA'
1..2 | Foreach-Object -Parallel {
    $using:test1
    $test2 = 'TestB'
    1..2 | Foreach-Object -Parallel {
        $using:test2
    }
}
Line |
   2 |  1..2 | Foreach-Object -Parallel {
     |         ~~~~~~~~~~~~~~~~~~~~~~~~~~
     | The value of the using variable '$using:test2' cannot be retrieved because it has not been set in the local session.

巢狀腳本區塊無法存取 $test2 變數,而且擲回錯誤。

參數

-ArgumentList

指定方法呼叫的自變數陣列。 如需 ArgumentList行為的詳細資訊,請參閱 about_Splatting

此參數是在 Windows PowerShell 3.0 中引進的。

參數屬性

類型:

Object[]

預設值:None
支援萬用字元:False
不要顯示:False
別名:參數

參數集

PropertyAndMethodSet
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-AsJob

讓平行調用以PowerShell作業的形式執行。 會傳回單一作業物件,而不是執行中腳本區塊的輸出。 作業物件包含每個執行之平行腳本區塊的子作業。 所有 PowerShell 作業 cmdlet 都可以使用作業物件來監視運行狀態和檢索數據。

此參數是在 PowerShell 7.0 中引進的。

參數屬性

類型:SwitchParameter
預設值:None
支援萬用字元:False
不要顯示:False

參數集

ParallelParameterSet
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-Begin

指定在此 Cmdlet 處理任何輸入物件之前執行的腳本區塊。 此腳本區塊只會針對整個管線執行一次。 如需區塊的詳細資訊 begin ,請參閱 about_Functions

參數屬性

類型:ScriptBlock
預設值:None
支援萬用字元:False
不要顯示:False

參數集

ScriptBlockSet
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-Confirm

在執行 Cmdlet 之前,提示您進行確認。

參數屬性

類型:SwitchParameter
預設值:False
支援萬用字元:False
不要顯示:False
別名:cf

參數集

(All)
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-End

指定在此 Cmdlet 處理所有輸入物件之後執行的腳本區塊。 此腳本區塊只會針對整個管線執行一次。 如需區塊的詳細資訊 end ,請參閱 about_Functions

參數屬性

類型:ScriptBlock
預設值:None
支援萬用字元:False
不要顯示:False

參數集

ScriptBlockSet
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-InputObject

指定輸入物件。 ForEach-Object 在每個輸入物件上執行腳本區塊或 operation 語句。 輸入包含 物件的變數,或輸入取得物件的命令或表達式。

當您搭配 使用 ForEach-Object 參數時,ForEach-Object 值會視為單一物件,而不是將命令結果 。 即使值是命令結果的集合,例如 -InputObject (Get-Process)也是如此。 由於 InputObject 無法從物件的陣列或集合傳回個別屬性,因此,如果您使用 ForEach-Object 針對那些在定義屬性中具有特定值的物件執行作業,您可以在管線中使用 ForEach-Object,如本主題中的範例所示。

參數屬性

類型:PSObject
預設值:None
支援萬用字元:False
不要顯示:False

參數集

(All)
Position:Named
必要:False
來自管線的值:True
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-MemberName

指定要取得的屬性,或要呼叫的方法。

允許通配符,但只有在產生的字串解析為唯一值時,才能運作。 例如,如果您執行 Get-Process | ForEach -MemberName *Name,通配符模式會比對多個造成命令失敗的成員。

此參數是在 Windows PowerShell 3.0 中引進的。

參數屬性

類型:String
預設值:None
支援萬用字元:True
不要顯示:False

參數集

PropertyAndMethodSet
Position:0
必要:True
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-Parallel

指定要用於平行處理輸入物件的腳本區塊。 輸入描述作業的腳本區塊。

此參數是在 PowerShell 7.0 中引進的。

參數屬性

類型:ScriptBlock
預設值:None
支援萬用字元:False
不要顯示:False

參數集

ParallelParameterSet
Position:Named
必要:True
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-Process

指定在每個輸入物件上執行的作業。 此腳本區塊會針對管線中的每個物件執行。 如需區塊的詳細資訊 process ,請參閱 about_Functions

當您將多個腳本區塊提供給 Process 參數時,第一個腳本區塊一律會對應至 begin 區塊。 如果只有兩個腳本區塊,則第二個區塊會對應至 process 區塊。 如果有三個或更多腳本塊,則第一個腳本塊始終映射到該 begin 塊,最後一個塊映射到該 end 塊,中間的塊都映射到該 process 塊。

參數屬性

類型:

ScriptBlock[]

預設值:None
支援萬用字元:False
不要顯示:False

參數集

ScriptBlockSet
Position:0
必要:True
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-RemainingScripts

指定 Process 參數未採用的所有腳本區塊。

此參數是在 Windows PowerShell 3.0 中引進的。

參數屬性

類型:

ScriptBlock[]

預設值:None
支援萬用字元:False
不要顯示:False

參數集

ScriptBlockSet
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-ThrottleLimit

指定並行的腳本塊數。 輸入物件會遭到封鎖,直到執行中的腳本區塊計數低於 ThrottleLimit 為止。 預設值是 5

此參數是在 PowerShell 7.0 中引進的。

參數屬性

類型:Int32
預設值:5
支援萬用字元:False
不要顯示:False

參數集

ParallelParameterSet
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-TimeoutSeconds

指定等候所有輸入平行處理的秒數。 在指定的逾時時間之後,所有執行中的腳本都會停止。 系統會忽略要處理的任何剩餘輸入物件。 的預設值 0 會停用逾時,而且 ForEach-Object -Parallel 可以無限期執行。 在命令行輸入 Ctrl+C 會停止執行 ForEach-Object -Parallel 中的命令。 此參數不能與 AsJob 參數一起使用。

此參數是在 PowerShell 7.0 中引進的。

參數屬性

類型:Int32
預設值:0
支援萬用字元:False
不要顯示:False

參數集

ParallelParameterSet
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-UseNewRunspace

讓平行調用為每個迴圈反覆專案建立新的 Runspace,而不是從 Runspace 集區重複使用 Runspace。

此參數是在 PowerShell 7.1 中引進的

參數屬性

類型:SwitchParameter
預設值:False
支援萬用字元:False
不要顯示:False

參數集

ParallelParameterSet
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-WhatIf

顯示 Cmdlet 執行時會發生什麼事。 指令未執行。

參數屬性

類型:SwitchParameter
預設值:False
支援萬用字元:False
不要顯示:False
別名:無線

參數集

(All)
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

CommonParameters

此 Cmdlet 支援一般參數:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 如需詳細資訊,請參閱 about_CommonParameters

輸入

PSObject

您可以將任何物件通過管道傳遞至此命令工具。

輸出

PSObject

此 Cmdlet 會傳回由輸入決定的物件。

備註

Cmdlet 的運作方式與 foreach 語句 非常類似,不同之處在於您無法使用管線將輸入傳送至 Foreach 語句。 如需 Foreach 語句 的詳細資訊,請參閱 about_Foreach

從 PowerShell 4.0 開始,已新增 WhereForEach 方法來搭配集合使用。 您可以在這裡深入了解這些新方法 about_arrays

使用 ForEach-Object -Parallel

  • 參數集使用 ForEach-Object -Parallel PowerShell 的內部 API 在新的運行空間中運行每個腳本塊。 這比使用順序處理正常運行 ForEach-Object 的開銷要大得多。 與腳本塊執行的工作相比,並行運行的開銷很小的情況下,使用 Parallel 非常重要。 例如:

    • 在多核心計算機上計算大量腳本
    • 花費時間等候結果或執行檔案作業的腳本

    使用 Parallel 參數可能會導致腳本執行速度比正常慢很多。 特別是如果平行腳本是微不足道的。 使用 Parallel 進行實驗,以探索其可能有説明的位置。

  • 並行運行時,如果使用 ScriptPropertiesScriptMethods 修飾的物件在與腳本最初附加到它們不同的運行空間中運行,則無法保證它們正常運行。

    不論實際叫用的位置為何,Scriptblock 調用一律會嘗試在其 Runspace 中執行。 不過, ForEach-Object -Parallel 會建立在使用後刪除的暫存 Runspace,因此腳本不會再執行 Runspace。

    只要 Runspace 仍然存在,此行為就可以運作。 不過,如果腳本相依於只存在於呼叫端 Runspace 中,而不是 Runspace 中的外部變數,您可能無法取得所需的結果。

  • 非終止錯誤會寫入 Cmdlet 錯誤數據流,因為它們會在平行執行的 scriptblock 中發生。 因為平行腳本區塊執行順序不具決定性,因此錯誤數據流中出現錯誤的順序是隨機的。 同樣地,寫入至其他數據流的訊息,例如警告、詳細資訊或資訊,會以不確定的順序寫入這些數據流。

    終止錯誤,例如例外狀況,會終止其發生之 scriptblock 的個別平行實例。 一個 scriptblocks 中的終止錯誤可能不會造成 Cmdlet 的 Foreach-Object 終止。 其他腳本區塊會以平行方式執行,除非它們也遇到終止錯誤,否則會繼續執行。 終止錯誤會寫入錯誤數據流,做為 ErrorRecord,並具有的 FullyQualifiedErrorIdPSTaskException。 可以使用PowerShell try/catch或陷阱塊將終止錯誤轉換為非終止錯誤。

  • PipelineVariable 一般參數變數 $using:

    這很重要

    參數 ForEach-Object -Parallel 集會在不同的進程線程上平行執行腳本區塊。 $using: 關鍵詞允許將變數參考從 Cmdlet 調用線程傳遞至每個執行中的腳本區塊線程。 由於腳本區塊在不同的線程中執行,因此必須安全地使用以傳址方式傳遞的物件變數。 通常,從未更改的引用物件中讀取是安全的。 但是,如果正在修改物件狀態,則必須使用線程安全物件,例如 .NET System.Collection.Concurrent 類型(請參閱示例 11)。