ForEach-Object
對輸入物件集合中的每個物件執行作業。
語法
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 存取屬性。