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

語法

ForEach-Object [-Process] <ScriptBlock[]> [-Begin <scriptblock>] [-End <scriptblock>] [-InputObject <psobject>] [<CommonParameters>]

描述

ForEach-Object Cmdlet 會對輸入物件集合中的每個物件執行作業。這些輸入物件可以傳入到此 Cmdlet,或是使用 InputObject 參數指定。

要執行的作業會描述於指令碼區塊中,而且是以 Process 參數的值提供給 Cmdlet。此指令碼區塊可以包含任何 Windows PowerShell 指令碼。

在此指令碼區塊中,目前的輸入物件會以 $_ 變數表示。

除了使用這種描述要對每個輸入物件執行之作業的指令碼區塊以外,您還可以另外提供兩種指令碼區塊。其中一種指定為 Begin 參數值的指令碼區塊,可在處理第一個輸入物件之前執行。另一種指定為 End 參數值的指令碼區塊,則可在處理最後一個輸入物件之後執行。

所有指令碼區塊 (包括使用 Begin 和 End 指定的指令碼區塊) 的評估結果都會沿著管線向下傳遞。

參數

-Begin <scriptblock>

指定要在處理任何輸入物件前先執行的指令碼區塊。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

-End <scriptblock>

指定要在處理所有的輸入物件後才執行的指令碼區塊。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

-InputObject <psobject>

接受物件以對其執行 process 參數所指定的指令碼區塊。請輸入包含物件的變數,或輸入可取得物件的命令或運算式。

必要?

false

位置?

named

預設值

接受管線輸入?

true (ByValue)

接受萬用字元?

false

-Process <ScriptBlock[]>

指定要套用至每個內送物件的指令碼區塊。

必要?

true

位置?

1

預設值

接受管線輸入?

false

接受萬用字元?

false

<CommonParameters>

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

輸入和輸出

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

輸入

System.Management.Automation.PSObject

您可經由管道將任何物件輸出至 ForEach-Object。

輸出

System.Management.Automation.PSObject

ForEach-Object 所傳回的物件是由輸入所決定。

範例 1

C:\PS>30000,56798,12432 | foreach-object -process {$_/1024}

描述
-----------
這個命令會接受整數陣列,將其中各個整數除以 1024,然後顯示結果。






範例 2

C:\PS>get-childitem C:\ | foreach-object -process { $_.length / 1024 }

描述
-----------
這個命令會擷取 C: 磁碟機根目錄中的檔案和目錄,然後傳回並顯示其中每個項目的大小。零值代表其中沒有可用檔案大小的目錄。






範例 3

C:\PS>$events = get-eventlog -logname system -newest 1000

C:\PS> $events | foreach-object -begin {get-date} -process {out-file -filepath events.txt -append -inputobject $_.message} -end {get-date}

描述
-----------
這個命令會從系統記錄檔擷取 1000 個最新事件,並將它們存放在 $events 變數。接著,它會經由管道將這些事件輸出至 ForEach-Object Cmdlet。Begin 參數會顯示目前的日期和時間。接著,Process 參數會使用 Out-File Cmdlet 建立名為 events.txt 的文字檔,並將各個事件的 message 屬性存放在該檔案中。最後,在全部處理都完成之後,使用 End 參數來顯示日期和時間。






範例 4

C:\PS>get-itemproperty -path hkcu:\Network\* | foreach-object {set-itemproperty -path $_.pspath -name RemotePath -value $_.RemotePath.ToUpper();}

描述
-----------
這個命令會將 HKCU:\Network 機碼底下所有子機碼的 RemotePath 登錄項目值變更為大寫字母。您可以使用此格式,變更登錄項目值的格式或內容。

Network 機碼中的每個子機碼都代表登入時將會重新連接的對應網路磁碟機。RemotePath 項目包含所連接之磁碟機的 UNC 路徑。例如,如果您將 E 磁碟機對應至 \\Server\Share,則會有 HKCU:\Network 的 E 子機碼,而且 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 存取屬性。









目錄