ForEach-Object
Melakukan operasi terhadap setiap item dalam kumpulan objek input.
Sintaks
ScriptBlockSet (Default)
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 <int>]
[-TimeoutSeconds <int>]
[-AsJob]
[-UseNewRunspace]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Deskripsi
ForEach-Object Cmdlet melakukan operasi pada setiap item dalam kumpulan objek input. Objek input dapat disalurkan ke cmdlet atau ditentukan menggunakan parameter InputObject .
Dimulai di Windows PowerShell 3.0, ada dua cara berbeda untuk membuat ForEach-Object perintah.
Sintaks blok skrip. Anda dapat menggunakan blok skrip untuk menentukan operasi. Dalam blok skrip, gunakan
$_variabel untuk mewakili objek saat ini. Blok skrip adalah nilai parameter Proses . Blok skrip dapat berisi skrip PowerShell apa pun.Misalnya, perintah berikut mendapatkan nilai properti ProcessName dari setiap proses di komputer.
Get-Process | ForEach-Object {$_.ProcessName}ForEach-Objectbeginmendukung blok ,process, danendseperti yang dijelaskan dalam about_Functions.Nota
Blok skrip berjalan dalam cakupan pemanggil. Oleh karena itu, blok memiliki akses ke variabel dalam cakupan tersebut dan dapat membuat variabel baru yang bertahan dalam cakupan tersebut setelah cmdlet selesai.
Sintaks yang disederhanakan. Dengan menggunakan sintaks yang disederhanakan, Anda menentukan properti atau nama metode objek dalam alur.
ForEach-Objectmengembalikan nilai properti atau metode untuk setiap objek dalam alur.Misalnya, perintah berikut juga mendapatkan nilai properti ProcessName dari setiap proses di komputer.
Get-Process | ForEach-Object ProcessNameSintaks yang disederhanakan diperkenalkan di Windows PowerShell 3.0. Untuk informasi selengkapnya, lihat about_Simplified_Syntax.
Blok skrip yang berjalan paralel. Dimulai dengan PowerShell 7.0, set parameter ketiga tersedia yang menjalankan setiap blok skrip secara paralel. Parameter ThrottleLimit membatasi jumlah skrip paralel yang berjalan pada satu waktu. Seperti sebelumnya, gunakan
$_variabel untuk mewakili objek input saat ini di blok skrip. Gunakan pengubahUsing:cakupan untuk meneruskan referensi variabel ke skrip yang sedang berjalan.Di PowerShell 7, runspace baru dibuat untuk setiap iterasi perulangan untuk memastikan isolasi maksimum. Ini bisa menjadi performa besar dan hit sumber daya jika pekerjaan yang Anda lakukan kecil dibandingkan dengan membuat runspace baru atau jika ada banyak iterasi yang melakukan pekerjaan yang signifikan. Pada PowerShell 7.1, runspace dari kumpulan runspace digunakan kembali secara default. Parameter ThrottleLimit mengatur ukuran kumpulan runspace. Ukuran kumpulan runspace default adalah 5. Anda masih dapat membuat runspace baru untuk setiap iterasi menggunakan sakelar UseNewRunspace .
Secara default, blokir skrip paralel menggunakan direktori kerja pemanggil saat ini yang memulai tugas paralel.
Untuk informasi selengkapnya, lihat bagian CATATAN di artikel ini.
Contoh
Contoh 1: Membagi bilangan bulat dalam array
Contoh ini mengambil array tiga bilangan bulat dan membagi masing-masing dengan 1024.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Contoh 2: Mendapatkan panjang semua file dalam direktori
Contoh ini memproses file dan direktori di direktori $PSHOMEpenginstalan PowerShell .
Get-ChildItem $PSHOME | ForEach-Object -Process {
if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }
}
Jika objek bukan direktori, blok skrip mendapatkan nama file, membagi nilai properti Panjangnya dengan 1024, dan menambahkan spasi (" ") untuk memisahkannya dari entri berikutnya. Cmdlet menggunakan properti PSIsContainer untuk menentukan apakah objek adalah direktori.
Contoh 3: Beroperasi pada peristiwa Sistem terbaru
Contoh ini menulis 1000 peristiwa terbaru dari log peristiwa Sistem ke file teks. Waktu saat ini ditampilkan sebelum dan sesudah memproses peristiwa.
Get-EventLog -LogName System -Newest 1000 |
ForEach-Object -Begin {Get-Date} -Process {
Out-File -FilePath Events.txt -Append -InputObject $_.Message
} -End {Get-Date}
Get-EventLog mendapatkan 1000 peristiwa terbaru dari log peristiwa Sistem dan menyalurkannya ke ForEach-Object cmdlet. Parameter Mulai menampilkan tanggal dan waktu saat ini. Selanjutnya, parameter Proses menggunakan Out-File cmdlet untuk membuat file teks yang bernama events.txt dan menyimpan properti pesan dari setiap peristiwa dalam file tersebut. Terakhir, parameter Akhir digunakan untuk menampilkan tanggal dan waktu setelah semua pemrosesan selesai.
Contoh 4: Mengubah nilai kunci Registri
Contoh ini mengubah nilai entri registri RemotePath di semua subkey di bawah HKCU:\Network kunci menjadi teks huruf besar.
Get-ItemProperty -Path HKCU:\Network\* |
ForEach-Object {
Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper()
}
Anda dapat menggunakan format ini untuk mengubah formulir atau konten nilai entri registri.
Setiap kunci dalam kunci Jaringan mewakili drive jaringan yang dipetakan yang terhubung kembali saat masuk. Entri RemotePath berisi jalur UNC dari drive yang tersambung. Misalnya, jika Anda memetakan E: drive ke \\Server\Share, subkunci E dibuat HKCU:\Network dengan nilai registri RemotePath diatur ke \\Server\Share.
Perintah menggunakan Get-ItemProperty cmdlet untuk mendapatkan semua subkuntah kunci Jaringan dan Set-ItemProperty cmdlet untuk mengubah nilai entri registri RemotePath di setiap kunci.
Set-ItemProperty Dalam perintah, jalur adalah nilai properti PSPath dari kunci registri. Ini adalah properti objek Microsoft .NET Framework yang mewakili kunci registri, bukan entri registri. Perintah menggunakan metode ToUpper() dari nilai RemotePath , yang merupakan string REG_SZ.
Karena Set-ItemProperty mengubah properti setiap kunci, ForEach-Object cmdlet diperlukan untuk mengakses properti.
Contoh 5: Gunakan variabel otomatis $null
Contoh ini menunjukkan efek pipa $null variabel otomatis ke ForEach-Object cmdlet.
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
Karena PowerShell memperlakukan $null sebagai tempat penampung eksplisit, ForEach-Object cmdlet menghasilkan nilai untuk $null seperti yang dilakukan untuk objek lain yang disalurkan ke dalamnya.
Contoh 6: Mendapatkan nilai properti
Contoh ini mendapatkan nilai properti Jalur dari semua modul PowerShell yang diinstal menggunakan parameter MemberName cmdlet ForEach-Object .
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | foreach Path
Perintah kedua setara dengan yang pertama. Ini menggunakan Foreach alias ForEach-Object cmdlet dan menghilangkan nama parameter MemberName , yang bersifat opsional.
ForEach-Object Cmdlet berguna untuk mendapatkan nilai properti, karena mendapatkan nilai tanpa mengubah jenis, tidak seperti cmdlet Format atau Select-Object cmdlet, yang mengubah jenis nilai properti.
Contoh 7: Membagi nama modul menjadi nama komponen
Contoh ini menunjukkan tiga cara untuk membagi dua nama modul yang dipisahkan titik menjadi nama komponennya. Perintah memanggil metode Pisahkan string. Ketiga perintah menggunakan sintaks yang berbeda, tetapi setara dan dapat dipertukarkan. Outputnya sama untuk ketiga kasus.
"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
Perintah pertama menggunakan sintaks tradisional, yang mencakup blok skrip dan operator $_objek saat ini . Ini menggunakan sintaks titik untuk menentukan metode dan tanda kurung untuk mengapit argumen pembatas.
Perintah kedua menggunakan parameter MemberName untuk menentukan metode Split dan parameter ArgumentList untuk mengidentifikasi titik (.) sebagai pemisah pemisah.
Perintah ketiga menggunakan foreach alias ForEach-Object cmdlet dan menghilangkan nama parameter MemberName dan ArgumentList , yang bersifat opsional.
Contoh 8: Menggunakan ForEach-Object dengan dua blok skrip
Dalam contoh ini, kami meneruskan dua blok skrip secara posisional. Semua blok skrip mengikat parameter Proses . Namun, mereka diperlakukan seolah-olah mereka telah diteruskan ke parameter Mulai dan Proses .
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
Contoh 9: Menggunakan ForEach-Object dengan lebih dari dua blok skrip
Dalam contoh ini, kami meneruskan empat blok skrip secara posisional. Semua blok skrip mengikat parameter Proses . Namun, mereka diperlakukan seolah-olah mereka telah diteruskan ke parameter Mulai, Proses, dan Akhir .
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
Nota
Blok skrip pertama selalu dipetakan ke begin blok, blok terakhir dipetakan ke end blok, dan dua blok tengah dipetakan ke process blok.
Contoh 10: Jalankan beberapa blok skrip untuk setiap item alur
Seperti yang ditunjukkan pada contoh sebelumnya, beberapa blok skrip yang diteruskan menggunakan parameter Proses dipetakan ke parameter Mulai dan Akhir . Untuk menghindari pemetaan ini, Anda harus memberikan nilai eksplisit untuk parameter Mulai dan Akhir .
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three
Contoh 11: Jalankan skrip lambat dalam batch paralel
Contoh ini menjalankan blok skrip yang mengevaluasi string dan tidur selama satu detik.
$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
Nilai parameter ThrottleLimit diatur ke 4 sehingga input diproses dalam batch empat.
Pengubah Using: cakupan digunakan untuk meneruskan $Message variabel ke setiap blok skrip paralel.
Contoh 12: Mengambil entri log secara paralel
Contoh ini mengambil 50.000 entri log dari 5 log sistem pada komputer Windows lokal.
$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
Parameter Paralel menentukan blok skrip yang dijalankan secara paralel untuk setiap nama log input. Parameter ThrottleLimit memastikan bahwa kelima blok skrip berjalan secara bersamaan.
Contoh 13: Berjalan secara paralel sebagai pekerjaan
Contoh ini membuat pekerjaan yang menjalankan blok skrip secara paralel, dua per satu.
PS> $job = 1..10 | ForEach-Object -Parallel {
"Output: $_"
Start-Sleep 1
} -ThrottleLimit 2 -AsJob
PS> $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
23 Job23 PSTaskJob Running True PowerShell …
PS> $job.ChildJobs
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
24 Job24 PSTaskChildJob Completed True PowerShell …
25 Job25 PSTaskChildJob Completed True PowerShell …
26 Job26 PSTaskChildJob Running True PowerShell …
27 Job27 PSTaskChildJob Running True PowerShell …
28 Job28 PSTaskChildJob NotStarted False PowerShell …
29 Job29 PSTaskChildJob NotStarted False PowerShell …
30 Job30 PSTaskChildJob NotStarted False PowerShell …
31 Job31 PSTaskChildJob NotStarted False PowerShell …
32 Job32 PSTaskChildJob NotStarted False PowerShell …
33 Job33 PSTaskChildJob NotStarted False PowerShell …
Parameter ThrottleLimit membatasi jumlah blok skrip paralel yang berjalan pada satu waktu. Parameter AsJob menyebabkan ForEach-Object cmdlet mengembalikan objek pekerjaan alih-alih output streaming ke konsol. Variabel $job menerima objek pekerjaan yang mengumpulkan data output dan memantau status berjalan. Properti $job.ChildJobs berisi pekerjaan anak yang menjalankan blok skrip paralel.
Contoh 14: Menggunakan referensi variabel aman utas
Contoh ini memanggil blok skrip secara paralel untuk mengumpulkan objek Proses bernama unik.
$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
Satu instans objek ConcurrentDictionary diteruskan ke setiap blok skrip untuk mengumpulkan objek. Karena ConcurrentDictionary aman untuk utas, aman untuk dimodifikasi oleh setiap skrip paralel. Objek non-thread-safe, seperti System.Collections.Generic.Dictionary, tidak akan aman untuk digunakan di sini.
Nota
Contoh ini adalah penggunaan parameter Paralel yang tidak efisien. Skrip menambahkan objek input ke objek kamus bersamaan. Ini sepele dan tidak sepadan dengan overhead pemanggilan setiap skrip dalam utas terpisah. Berjalan ForEach-Object tanpa sakelar Paralel lebih efisien dan lebih cepat. Contoh ini hanya dimaksudkan untuk menunjukkan cara menggunakan variabel aman utas.
Contoh 15: Menulis kesalahan dengan eksekusi paralel
Contoh ini menulis ke aliran kesalahan secara paralel, di mana urutan kesalahan tertulis acak.
1..3 | ForEach-Object -Parallel {
Write-Error "Error: $_"
}
Write-Error: Error: 1
Write-Error: Error: 3
Write-Error: Error: 2
Contoh 16: Mengakhiri kesalahan dalam eksekusi paralel
Contoh ini menunjukkan kesalahan penghentian dalam satu blok skrip yang berjalan paralel.
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 tidak pernah ditulis karena blokir skrip paralel untuk iterasi tersebut dihentikan.
Nota
Variabel parameter umum PipelineVariabletidak didukung dalam ForEach-Object -Parallel skenario bahkan dengan pengubah Using: cakupan.
Contoh 17: Meneruskan variabel dalam blok skrip paralel berlapis
Anda dapat membuat variabel di luar ForEach-Object -Parallel blok skrip terlingkup dan menggunakannya di dalam blok skrip dengan pengubah Using: cakupan. Dimulai di PowerShell 7.2, Anda dapat membuat variabel di dalam ForEach-Object -Parallel blok skrip terlingkup dan menggunakannya di dalam blok skrip berlapis.
$test1 = 'TestA'
1..2 | ForEach-Object -Parallel {
$Using:test1
$test2 = 'TestB'
1..2 | ForEach-Object -Parallel {
$Using:test2
}
}
TestA
TestA
TestB
TestB
TestB
TestB
Nota
Dalam versi sebelum PowerShell 7.2, blokir skrip berlapis tidak dapat mengakses $test2 variabel dan kesalahan dilemparkan.
Contoh 18: Membuat beberapa pekerjaan yang menjalankan skrip secara paralel
Parameter ThrottleLimit membatasi jumlah skrip paralel yang berjalan selama setiap instans ForEach-Object -Parallel. Ini tidak membatasi jumlah pekerjaan yang dapat dibuat saat menggunakan parameter AsJob . Karena pekerjaan itu sendiri berjalan bersamaan, dimungkinkan untuk membuat beberapa pekerjaan paralel, masing-masing berjalan hingga jumlah batas pembatasan blokir skrip bersamaan.
$jobs = for ($i=0; $i -lt 10; $i++) {
1..10 | ForEach-Object -Parallel {
./RunMyScript.ps1
} -AsJob -ThrottleLimit 5
}
$jobs | Receive-Job -Wait
Contoh ini membuat 10 pekerjaan yang sedang berjalan. Setiap pekerjaan tidak berjalan lebih dari 5 skrip secara bersamaan. Jumlah total instans yang berjalan secara bersamaan dibatasi hingga 50 (10 pekerjaan kali ThrottleLimit 5).
Parameter
-ArgumentList
Menentukan array argumen ke panggilan metode. Untuk informasi lebih lanjut tentang perilaku ArgumentList, lihat about_Splatting.
Parameter ini diperkenalkan di Windows PowerShell 3.0.
Properti parameter
| Jenis: | Object[] |
| Nilai default: | None |
| Mendukung wildcard: | False |
| DontShow: | False |
| Alias: | Argumen |
Set parameter
PropertyAndMethodSet
| Position: | Named |
| Wajib: | False |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-AsJob
Menyebabkan pemanggilan paralel berjalan sebagai pekerjaan PowerShell. Satu objek pekerjaan dikembalikan alih-alih output dari blok skrip yang sedang berjalan. Objek pekerjaan berisi pekerjaan anak untuk setiap blok skrip paralel yang berjalan. Anda dapat menggunakan objek pekerjaan dengan salah satu cmdlet pekerjaan PowerShell untuk melihat status berjalan dan mengambil data.
Parameter ini diperkenalkan di PowerShell 7.0.
Properti parameter
| Jenis: | SwitchParameter |
| Nilai default: | None |
| Mendukung wildcard: | False |
| DontShow: | False |
Set parameter
ParallelParameterSet
| Position: | Named |
| Wajib: | False |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-Begin
Menentukan blok skrip yang berjalan sebelum cmdlet ini memproses objek input apa pun. Blok skrip ini hanya dijalankan sekali untuk seluruh alur. Untuk informasi selengkapnya tentang blokir, begin lihat about_Functions.
Properti parameter
| Jenis: | ScriptBlock |
| Nilai default: | None |
| Mendukung wildcard: | False |
| DontShow: | False |
Set parameter
ScriptBlockSet
| Position: | Named |
| Wajib: | False |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-Confirm
Meminta konfirmasi sebelum menjalankan cmdlet.
Properti parameter
| Jenis: | SwitchParameter |
| Nilai default: | False |
| Mendukung wildcard: | False |
| DontShow: | False |
| Alias: | Cf |
Set parameter
(All)
| Position: | Named |
| Wajib: | False |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-End
Menentukan blok skrip yang berjalan setelah cmdlet ini memproses semua objek input. Blok skrip ini hanya dijalankan sekali untuk seluruh alur. Untuk informasi selengkapnya tentang blokir, end lihat about_Functions.
Properti parameter
| Jenis: | ScriptBlock |
| Nilai default: | None |
| Mendukung wildcard: | False |
| DontShow: | False |
Set parameter
ScriptBlockSet
| Position: | Named |
| Wajib: | False |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-InputObject
Menentukan objek input.
ForEach-Object menjalankan blok skrip atau pernyataan operasi pada setiap objek input. Masukkan variabel yang berisi objek, atau ketik perintah atau ekspresi yang mendapatkan objek.
Saat Anda menggunakan parameter InputObject dengan ForEach-Object, alih-alih hasil perintah pipa ke ForEach-Object, nilai InputObject diperlakukan sebagai satu objek. Ini benar bahkan jika nilainya adalah koleksi yang merupakan hasil dari perintah, seperti -InputObject (Get-Process).
Karena InputObject tidak dapat mengembalikan properti individual dari array atau kumpulan objek, kami sarankan jika Anda menggunakan ForEach-Object untuk melakukan operasi pada kumpulan objek untuk objek yang memiliki nilai tertentu dalam properti yang ditentukan, Anda gunakan ForEach-Object dalam alur, seperti yang ditunjukkan dalam contoh dalam topik ini.
Properti parameter
| Jenis: | PSObject |
| Nilai default: | None |
| Mendukung wildcard: | False |
| DontShow: | False |
Set parameter
(All)
| Position: | Named |
| Wajib: | False |
| Nilai dari alur: | True |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-MemberName
Menentukan nama properti anggota untuk mendapatkan atau metode anggota untuk dipanggil. Anggota harus menjadi anggota instans, bukan anggota statis.
Karakter kartubebas diizinkan, tetapi hanya berfungsi jika string yang dihasilkan diselesaikan ke nilai unik.
Misalnya, jika Anda menjalankan Get-Process | foreach -MemberName *Name, pola kartubebas cocok dengan lebih dari satu anggota yang menyebabkan perintah gagal.
Parameter ini diperkenalkan di Windows PowerShell 3.0.
Properti parameter
| Jenis: | String |
| Nilai default: | None |
| Mendukung wildcard: | True |
| DontShow: | False |
Set parameter
PropertyAndMethodSet
| Position: | 0 |
| Wajib: | True |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-Parallel
Menentukan blok skrip yang akan digunakan untuk pemrosesan paralel objek input. Masukkan blok skrip yang menjelaskan operasi.
Parameter ini diperkenalkan di PowerShell 7.0.
Properti parameter
| Jenis: | ScriptBlock |
| Nilai default: | None |
| Mendukung wildcard: | False |
| DontShow: | False |
Set parameter
ParallelParameterSet
| Position: | Named |
| Wajib: | True |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-Process
Menentukan operasi yang dilakukan pada setiap objek input. Blok skrip ini dijalankan untuk setiap objek dalam alur. Untuk informasi selengkapnya tentang blokir, process lihat about_Functions.
Saat Anda menyediakan beberapa blok skrip ke parameter Proses , blok skrip pertama selalu dipetakan ke begin blok. Jika hanya ada dua blok skrip, blok kedua dipetakan ke process blok. Jika ada tiga blok skrip atau lebih, blok skrip pertama selalu dipetakan ke begin blok, blok terakhir dipetakan ke end blok, dan blok tengah dipetakan ke process blok.
Properti parameter
| Jenis: | |
| Nilai default: | None |
| Mendukung wildcard: | False |
| DontShow: | False |
Set parameter
ScriptBlockSet
| Position: | 0 |
| Wajib: | True |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-RemainingScripts
Menentukan semua blok skrip yang tidak diambil oleh parameter Proses .
Parameter ini diperkenalkan di Windows PowerShell 3.0.
Properti parameter
| Jenis: | |
| Nilai default: | None |
| Mendukung wildcard: | False |
| DontShow: | False |
Set parameter
ScriptBlockSet
| Position: | Named |
| Wajib: | False |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-ThrottleLimit
Menentukan jumlah blok skrip yang berjalan secara paralel. Objek input diblokir hingga jumlah blok skrip yang sedang berjalan berada di bawah ThrottleLimit. Nilai defaultnya adalah 5.
Parameter ThrottleLimit membatasi jumlah skrip paralel yang berjalan selama setiap instans ForEach-Object -Parallel. Ini tidak membatasi jumlah pekerjaan yang dapat dibuat saat menggunakan parameter AsJob . Karena pekerjaan itu sendiri berjalan bersamaan, dimungkinkan untuk membuat sejumlah pekerjaan paralel, masing-masing berjalan hingga jumlah batas pembatasan blokir skrip bersamaan.
Parameter ini diperkenalkan di PowerShell 7.0.
Properti parameter
| Jenis: | Int32 |
| Nilai default: | 5 |
| Mendukung wildcard: | False |
| DontShow: | False |
Set parameter
ParallelParameterSet
| Position: | Named |
| Wajib: | False |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-TimeoutSeconds
Menentukan jumlah detik untuk menunggu semua input diproses secara paralel. Setelah waktu habis yang ditentukan, semua skrip yang berjalan dihentikan. Dan objek input yang tersisa untuk diproses diabaikan. Nilai 0 default menonaktifkan batas waktu, dan ForEach-Object -Parallel dapat berjalan tanpa batas waktu. Mengetik Ctrl+C di baris perintah menghentikan perintah yang sedang berjalan ForEach-Object -Parallel . Parameter ini tidak dapat digunakan bersama dengan parameter AsJob .
Parameter ini diperkenalkan di PowerShell 7.0.
Properti parameter
| Jenis: | Int32 |
| Nilai default: | 0 |
| Mendukung wildcard: | False |
| DontShow: | False |
Set parameter
ParallelParameterSet
| Position: | Named |
| Wajib: | False |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-UseNewRunspace
Menyebabkan pemanggilan paralel membuat runspace baru untuk setiap iterasi perulangan alih-alih menggunakan kembali runspace dari kumpulan runspace.
Parameter ini diperkenalkan di PowerShell 7.1
Properti parameter
| Jenis: | SwitchParameter |
| Nilai default: | False |
| Mendukung wildcard: | False |
| DontShow: | False |
Set parameter
ParallelParameterSet
| Position: | Named |
| Wajib: | False |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
-WhatIf
Menunjukkan apa yang akan terjadi ketika cmdlet dijalankan. Cmdlet tidak dijalankan.
Properti parameter
| Jenis: | SwitchParameter |
| Nilai default: | False |
| Mendukung wildcard: | False |
| DontShow: | False |
| Alias: | wi |
Set parameter
(All)
| Position: | Named |
| Wajib: | False |
| Nilai dari alur: | False |
| Nilai dari alur berdasarkan nama properti: | False |
| Nilai dari argumen yang tersisa: | False |
CommonParameters
Cmdlet ini mendukung parameter umum: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction, dan -WarningVariable. Untuk informasi selengkapnya, lihat about_CommonParameters.
Input
PSObject
Anda dapat menyalurkan objek apa pun ke cmdlet ini.
Output
PSObject
Cmdlet ini mengembalikan objek yang ditentukan oleh input.
Catatan
PowerShell menyertakan alias berikut untuk ForEach-Object:
- Semua Platform:
%foreach
ForEach-Object Cmdlet berfungsi seperti foreach pernyataan, kecuali bahwa Anda tidak dapat menyalurkan input ke foreach pernyataan. Untuk informasi selengkapnya tentang pernyataan tersebut foreach , lihat about_Foreach.
Mulai dari PowerShell 4.0, Where dan ForEach metode ditambahkan untuk digunakan dengan koleksi. Anda dapat membaca selengkapnya tentang metode baru ini di sini about_Arrays
Menggunakan ForEach-Object -Parallel:
ForEach-Object -Parallelmenjalankan setiap blok skrip di runspace baru. Runspace baru membuat overhead yang jauh lebih besar daripada berjalanForEach-Objectdengan pemrosesan berurutan. Penting untuk menggunakan Paralel di mana overhead berjalan secara paralel kecil dibandingkan dengan pekerjaan yang dilakukan blok skrip. Contohnya:- Menghitung skrip intensif pada komputer multi-inti
- Skrip yang menghabiskan waktu menunggu hasil atau melakukan operasi file
Menggunakan parameter Paralel dapat menyebabkan skrip berjalan jauh lebih lambat dari biasanya. Terutama jika skrip paralel sepele. Bereksperimenlah dengan Paralel untuk menemukan di mana itu bisa bermanfaat.
Saat berjalan secara paralel, objek yang dihiasi dengan ScriptProperties atau ScriptMethods tidak dapat dijamin berfungsi dengan benar jika dijalankan di runspace yang berbeda dari skrip yang awalnya melekat padanya.
Pemanggilan skrip selalu mencoba berjalan di runspace berandanya , terlepas dari di mana pemanggilannya sebenarnya. Namun,
ForEach-Object -Parallelmembuat runspace sementara yang dihapus setelah digunakan, sehingga tidak ada runspace untuk skrip yang akan dijalankan lagi.Perilaku ini dapat bekerja selama runspace beranda masih ada. Namun, Anda mungkin tidak mendapatkan hasil yang diinginkan jika skrip bergantung pada variabel eksternal yang hanya ada di runspace pemanggil dan bukan runspace beranda .
Kesalahan yang tidak mengakhiri ditulis ke aliran kesalahan cmdlet saat terjadi dalam blok skrip yang berjalan paralel. Karena urutan eksekusi blok skrip paralel tidak deterministik, urutan munculnya kesalahan dalam aliran kesalahan adalah acak. Demikian juga, pesan yang ditulis ke aliran data lain, seperti peringatan, verbose, atau informasi ditulis ke aliran data tersebut dalam urutan yang tidak ditentukan.
Mengakhiri kesalahan, seperti pengecualian, mengakhiri instans paralel individu dari blok skrip tempat terjadinya. Kesalahan penghentian dalam satu blok skrip mungkin tidak menyebabkan penghentian
ForEach-Objectcmdlet. Blokir skrip lainnya, berjalan secara paralel, terus berjalan kecuali mereka juga mengalami kesalahan yang mengakhiri. Kesalahan penghentian ditulis ke aliran data kesalahan sebagai ErrorRecord dengan FullyQualifiedErrorId dariPSTaskException. Mengakhiri kesalahan dapat dikonversi ke kesalahan yang tidak mengakhiri penggunaan PowerShelltry/catchatautrapblok.Variabel parameter umum PipelineVariabletidak didukung dalam skenario paralel bahkan dengan pengubah
Using:cakupan.Penting
Set
ForEach-Object -Parallelparameter menjalankan blok skrip secara paralel pada utas proses terpisah. PengubahUsing:memungkinkan meneruskan referensi variabel dari utas pemanggilan cmdlet ke setiap utas blok skrip yang sedang berjalan. Karena blok skrip berjalan di utas yang berbeda, variabel objek yang diteruskan oleh referensi harus digunakan dengan aman. Umumnya aman untuk membaca dari objek yang dirujuk yang tidak berubah. Jika Anda perlu mengubah status objek maka Anda harus menggunakan objek aman utas, seperti .NET System.Collection.Concurrent type (Lihat Contoh 14).