ForEach-Object
Giriş nesneleri koleksiyonundaki her öğeye karşı bir işlem gerçekleştirir.
Syntax
ScriptBlockSet (Varsayılan)
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'i, giriş nesneleri koleksiyonundaki her öğe üzerinde bir işlem gerçekleştirir. Giriş nesneleri cmdlet'ine yöneltilebilir veya InputObject parametresi kullanılarak belirtilebilir.
Windows PowerShell 3.0'dan başlayarak, ForEach-Object komutu oluşturmanın iki farklı yolu vardır.
Betik bloğu. İşlemi belirtmek için bir betik bloğu kullanabilirsiniz. Betik bloğunda, geçerli nesneyi temsil etmek için
$_değişkenini kullanın. Betik bloğu, İşlem parametresinin değeridir. Betik bloğu herhangi bir PowerShell betiği içerebilir.Örneğin, aşağıdaki komut bilgisayardaki her işlemin ProcessName özelliğinin değerini alır.
Get-Process | ForEach-Object {$_.ProcessName}ForEach-Object,begin'de açıklandığı gibiprocess,endve bloklarını destekler.Uyarı
Betik blokları çağıranın kapsamında çalışır. Bu nedenle, blokların bu kapsamdaki değişkenlere erişimi vardır ve cmdlet tamamlandıktan sonra bu kapsamda kalıcı olan yeni değişkenler oluşturabilir.
Operation deyimi. Ayrıca doğal dile çok benzeyen bir işlem deyimi de yazabilirsiniz. Bir özellik değeri belirtmek veya bir yöntem çağırmak için işlem deyimini kullanabilirsiniz. İşlem deyimleri Windows PowerShell 3.0'da kullanıma sunulmuştur.
Örneğin, aşağıdaki komut ayrıca bilgisayardaki her işlemin ProcessName özelliğinin değerini alır.
Get-Process | ForEach-Object ProcessNameParalel çalışan betik bloğu. PowerShell 7.0 sürümünden başlayarak, her betik bloğunu paralel olarak çalıştıran üçüncü bir parametre kümesi kullanılabilir. ThrottleLimit parametresi, aynı anda çalışan paralel betik sayısını sınırlar. Daha önce olduğu gibi, betik bloğundaki geçerli giriş nesnesini göstermek için değişkenini kullanın
$_. Çalışan betike değişken başvuruları geçirmek için$using:anahtar sözcüğünü kullanın.PowerShell 7'de, maksimum yalıtım sağlamak için her döngü yinelemesi için yeni bir çalışma alanı oluşturulur. Yaptığınız iş yeni çalışma alanları oluşturmaya kıyasla küçükse veya önemli bir çalışma gerçekleştiren çok fazla yineleme varsa, bu büyük bir performans ve kaynak isabeti olabilir. PowerShell 7.1'den itibaren, bir runspace havuzundan gelen runspace'ler varsayılan olarak yeniden kullanılır. Çalışma alanı havuzu boyutu ThrottleLimit parametresi tarafından belirtilir. Varsayılan çalışma alanı havuzu boyutu 5'tir. Yine de UseNewRunspace anahtarını kullanarak her yineleme için yeni bir çalışma alanı oluşturabilirsiniz.
Varsayılan olarak, paralel betik blokları paralel görevleri başlatan çağıranın geçerli çalışma dizinini kullanır.
Daha fazla bilgi için bu makalenin NOTLAR bölümüne bakın.
Örnekler
Örnek 1: Dizideki tamsayıları bölme
Bu örnek üç tamsayıdan oluşan bir dizi alır ve bunların her birini 1024'e böler.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Örnek 2: Dizindeki tüm dosyaların uzunluğunu alma
Bu örnek, $PSHOMEPowerShell yükleme dizinindeki dosyaları ve dizinleri işler.
Get-ChildItem $PSHOME |
ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
Nesne bir dizin değilse, betik bloğu dosyanın adını alır, Length özelliğinin değerini 1024'e böler ve bir sonraki girdiden ayırmak için bir boşluk (" ") ekler. Cmdlet, bir nesnenin dizin olup olmadığını belirlemek için PSISContainer özelliğini kullanır.
Örnek 3: En son Sistem olayları üzerinde çalışma
Bu örnek, Sistem olay günlüğündeki en son 1000 olayı bir metin dosyasına yazar. Geçerli saat, olaylar işlenmeden önce ve işlendikten sonra görüntülenir.
$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 Sistem olay günlüğünden en son 1000 olayı alır ve bunları değişkende $Events depolar.
$Events daha sonra cmdlet'e yöneltilir ForEach-Object .
Begin parametresi geçerli tarih ve saati görüntüler. Daha sonra İşlem parametresi Out-File cmdlet'ini kullanarak events.txt adlı bir metin dosyası oluşturur ve bu dosyadaki olayların her birinin ileti özelliğini depolar. Son olarak, End parametresi, tüm işleme tamamlandıktan sonra tarih ve saati görüntülemek için kullanılır.
Örnek 4: Kayıt defteri anahtarının değerini değiştirme
Bu örnek, anahtarın altındaki tüm alt anahtarlarda bulunan HKCU:\Network kayıt defteri girdisinin değerini büyük harfli metne dönüştürür.
Get-ItemProperty -Path HKCU:\Network\* |
ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}
Kayıt defteri giriş değerinin biçimini veya içeriğini değiştirmek için bu biçimi kullanabilirsiniz.
Ağ anahtarındaki her alt anahtar, oturum açma sırasında yeniden bağlanan eşlenmiş bir ağ sürücüsünü temsil eder.
RemotePath girdisi, bağlı sürücünün UNC yolunu içerir. Örneğin, E: sürücüsünü ile \\Server\Shareeşlerseniz, RemotePath kayıt defteri değeri olarak HKCU:\Network ayarlanmış \\Server\Sharebir E alt anahtarı oluşturulur.
Komut, Get-ItemProperty anahtarının tüm alt anahtarlarını almak için cmdlet'ini ve her anahtardaki Set-ItemProperty kayıt defteri girdisinin değerini değiştirmek için cmdlet'ini kullanır.
komutunda Set-ItemProperty yol, kayıt defteri anahtarının PSPath özelliğinin değeridir. Bu, kayıt defteri girdisini değil, kayıt defteri anahtarını temsil eden Microsoft .NET Framework nesnesinin bir özelliğidir. Komut, bir dize (REG_SZ) olan RemotePath değerinin ToUpper() yöntemini kullanır.
Set-ItemProperty her anahtarın özelliğini değiştirdiğinden, özelliğe erişmek için ForEach-Object cmdlet'i gerekir.
Örnek 5: $Null otomatik değişkenini kullanma
Bu örnek, $Null otomatik değişkeni ForEach-Object cmdlet'ine bağlamanın etkisini gösterir.
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
PowerShell null değerini açık bir yer tutucu olarak kabul ettiğinden, ForEach-Object cmdlet'i $Nulliçin bir değer oluşturur; aynı sizin kanal oluşturduğunuz diğer nesneler için olduğu gibi.
Örnek 6: Özellik değerlerini alma
Bu örnek, cmdlet'in MemberName parametresini kullanarak tüm yüklü PowerShell modüllerinin ForEach-Object özelliğinin değerini alır.
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
İkinci komut, birinci komutla eşdeğerdir. Cmdlet'in Foreach diğer adını kullanır ForEach-Object ve isteğe bağlı olan MemberName parametresinin adını atlar.
ForEach-Object cmdlet'i özellik değerlerini almak için kullanışlıdır, çünkü özellik değeri türünü değiştiren Biçim cmdlet'lerinden veya Select-Object cmdlet'inden farklı olarak türü değiştirmeden değeri alır.
Örnek 7: Modül adlarını bileşen adlarına bölme
Bu örnekte, iki noktayla ayrılmış modül adını bileşen adlarına bölmenin üç yolu gösterilmektedir. Komutlar dizelerin Split yöntemini çağırır. Üç komut farklı söz dizimi kullanır, ancak eşdeğer ve değiştirilebilir. Çıkış, üç durumda da aynıdır.
"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
İlk komut, bir betik bloğu ve geçerli nesne işleci $_içeren geleneksel söz dizimini kullanır. Sınırlayıcı bağımsız değişkenini kapsayan yöntemi ve parantezleri belirtmek için nokta söz dizimini kullanır.
İkinci komut, Split yöntemini belirtmek için MemberName parametresini ve bölme sınırlayıcısı olarak noktayı () tanımlamak için . parametresini kullanır.
Üçüncü komut, cmdlet'in ForEach-Object diğer adını kullanır ve isteğe bağlı MemberName ve ArgumentList parametrelerinin adlarını atlar.
Örnek 8: İki betik bloğuyla ForEach-Object kullanma
Bu örnekte, konumsal olarak iki betik bloğu geçiririz. Tüm betik blokları process parametresine bağlanır. Ancak, bunlar Başlangıç ve İşlem parametrelerine geçirilmiş gibi kabul edilir.
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
Örnek 9: İkiden fazla betik bloğuyla ForEach-Object kullanma
Bu örnekte, konumsal olarak iki betik bloğu geçiririz. Tüm betik blokları process parametresine bağlanır. Ancak, Begin, Process ve End parametrelerine geçirilmiş gibi kabul edilirler.
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
Uyarı
İlk komut dosyası bloğu her zaman bloğa eşlenir begin , son blok bloğa end eşlenir ve aradaki blokların tümü bloğa process eşlenir.
Örnek 10: Her işlem hattı öğesi için birden çok betik bloğu çalıştırma
Önceki örnekte gösterildiği gibi, İşlem parametresi kullanılarak geçirilen birden çok betik bloğu Başlangıç ve Bitiş parametrelerine eşlenir. Bu eşlemeyi önlemek için Başlangıç ve Bitiş parametreleri için açık değerler sağlamanız gerekir.
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three
Örnek 11: Yavaş betiği paralel toplu işlerde çalıştırma
Bu örnek, bir dizeyi değerlendiren ve bir saniye boyunca uyuyan basit bir betik bloğu çalıştırır.
$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
Girişin dört toplu olarak işlenmesi için ThrottleLimit parametre değeri 4 olarak ayarlanır.
$using: anahtar sözcüğü, $Message değişkenini her paralel betik bloğuna geçirmek için kullanılır.
Örnek 12: Günlük girdilerini paralel olarak alma
Bu örnek, yerel bir Windows makinesindeki 5 sistem günlüğünden 50.000 günlük girdisi alır.
$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 parametresi, her giriş günlüğü adı için paralel olarak çalıştırılacak betik bloğunu belirtir. ThrottleLimit parametresi, beş betik bloğunun da aynı anda çalışmasını sağlar.
Örnek 13: paralel olarak iş olarak çalıştırma
Bu örnek, basit bir betik bloğunu paralel olarak çalıştırır ve aynı anda iki arka plan işi oluşturur.
$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
Değişken $job , çıktı verilerini toplayan ve çalışma durumunu izleyen iş nesnesini alır.
İş nesnesine Wait switch parametresi ile yöneltilirReceive-Job. Ve bu, sanki ForEach-Object -ParallelAsJob olmadan çalıştırılmış gibi çıktıyı konsola aktarır.
Örnek 14: İş parçacığı güvenli değişken başvurularını kullanma
Bu örnek, benzersiz olarak adlandırılmış process nesnelerini toplamak için betik bloklarını paralel olarak çağırır.
$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
Nesneleri toplamak için her betik bloğuna tek bir ConcurrentDictionary nesnesi örneği geçirilir. ConcurrentDictionary iş parçacığı güvenli olduğundan, her paralel betik tarafından değiştirilmesi güvenlidir. System.Collections.Generic.Dictionary gibi iş parçacığı güvenli olmayan bir nesnenin burada kullanılması güvenli olmaz.
Uyarı
Bu örnek, Paralel parametrenin çok verimsiz bir kullanımıdır. Komut dosyası, giriş nesnesini eşzamanlı bir sözlük nesnesine ekler. Önemsizdir ve her bir komut dosyasını ayrı bir iş parçacığında çağırmanın ek yüküne değmez.
Paralel anahtar olmadan normal şekilde çalışmak ForEach-Object çok daha verimli ve daha hızlıdır. Bu örnek yalnızca iş parçacığı güvenli değişkenlerin nasıl kullanılacağını göstermek için tasarlanmıştır.
Örnek 15: Paralel yürütme ile hata yazma
Bu örnek, yazılı hataların sırasının rastgele olduğu hata akışına paralel olarak yazar.
1..3 | ForEach-Object -Parallel {
Write-Error "Error: $_"
}
Write-Error: Error: 1
Write-Error: Error: 3
Write-Error: Error: 2
Örnek 16: Paralel yürütmede hataları sonlandırma
Bu örnekte paralel çalışan bir betik bloğunda sonlandırma hatası gösterilmektedir.
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 hiçbir zaman yazılmamıştır çünkü bu yineleme için paralel betik bloğu sonlandırılmıştır.
Uyarı
PipelineVariable ortak parametre değişkenleri $using: desteklenmez.
Örnek 17: ScriptBlockSet iç içe paralel betikte değişkenleri geçirme
Foreach-Object -Parallel kapsamlı bir betik bloğunun dışında bir değişken oluşturabilir ve bunu $using anahtar sözcüğüyle betik bloğunun içinde kullanabilirsiniz.
$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.
İç içe betik bloğu $test2 değişkenine erişemiyor ve bir hata oluşuyor.
Parametreler
-ArgumentList
Bir yöntem çağrısı için bağımsız değişken dizisini belirtir. ArgumentList'in davranışı hakkında daha fazla bilgi için about_Splattingbölümüne bakın.
Bu parametre Windows PowerShell 3.0'da kullanıma sunulmuştur.
Parametre özellikleri
| Tür: | Object[] |
| Default value: | None |
| Joker karakterleri destekler: | False |
| DontShow: | False |
| Diğer adlar: | Argümanlar |
Parametre kümeleri
PropertyAndMethodSet
| Position: | Named |
| Zorunlu: | False |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-AsJob
Paralel çağırmanın PowerShell işi olarak çalışmasına neden olur. Çalışan betik bloklarından çıkış yerine tek bir iş nesnesi döndürülür. İş nesnesi, çalışan her paralel betik bloğu için alt işler içerir. İş nesnesi, çalışma durumunu izlemek ve verileri almak için tüm PowerShell iş cmdlet'leri tarafından kullanılabilir.
Bu parametre PowerShell 7.0'da kullanıma sunulmuştur.
Parametre özellikleri
| Tür: | SwitchParameter |
| Default value: | None |
| Joker karakterleri destekler: | False |
| DontShow: | False |
Parametre kümeleri
ParallelParameterSet
| Position: | Named |
| Zorunlu: | False |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-Begin
Bu cmdlet herhangi bir giriş nesnesini işlemeden önce çalıştırılan bir betik bloğunu belirtir. Bu betik bloğu, işlem hattının tamamı için yalnızca bir kez çalıştırılır. Blok hakkında begin daha fazla bilgi için bkz. about_Functions.
Parametre özellikleri
| Tür: | ScriptBlock |
| Default value: | None |
| Joker karakterleri destekler: | False |
| DontShow: | False |
Parametre kümeleri
ScriptBlockSet
| Position: | Named |
| Zorunlu: | False |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-Confirm
Cmdlet'i çalıştırmadan önce sizden onay ister.
Parametre özellikleri
| Tür: | SwitchParameter |
| Default value: | False |
| Joker karakterleri destekler: | False |
| DontShow: | False |
| Diğer adlar: | Cf |
Parametre kümeleri
(All)
| Position: | Named |
| Zorunlu: | False |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-End
Bu cmdlet tüm giriş nesnelerini işledikten sonra çalıştırılan bir betik bloğu belirtir. Bu betik bloğu, işlem hattının tamamı için yalnızca bir kez çalıştırılır. Blok hakkında end daha fazla bilgi için bkz. about_Functions.
Parametre özellikleri
| Tür: | ScriptBlock |
| Default value: | None |
| Joker karakterleri destekler: | False |
| DontShow: | False |
Parametre kümeleri
ScriptBlockSet
| Position: | Named |
| Zorunlu: | False |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-InputObject
Giriş nesnelerini belirtir.
ForEach-Object her giriş nesnesinde betik bloğunu veya işlem deyimini çalıştırır. Nesneleri içeren bir değişken girin veya nesneleri alan bir komut veya ifade yazın.
Komutun sonuçlarını öğesine göndermek yerine ile ForEach-ObjectForEach-Object parametresini kullandığınızda, InputObject değeri tek bir nesne olarak değerlendirilir. Değer, -InputObject (Get-Process)gibi bir komutun sonucu olan bir koleksiyon olsa bile bu durum geçerlidir.
InputObject bir diziden veya nesne koleksiyonundan tek tek özellikleri döndüremediğinden, tanımlı özelliklerde belirli değerlere sahip nesneler için bir nesne koleksiyonu üzerinde işlem gerçekleştirmek üzere ForEach-Object kullanırsanız, bu konudaki örneklerde gösterildiği gibi işlem hattında ForEach-Object kullanmanızı öneririz.
Parametre özellikleri
| Tür: | PSObject |
| Default value: | None |
| Joker karakterleri destekler: | False |
| DontShow: | False |
Parametre kümeleri
(All)
| Position: | Named |
| Zorunlu: | False |
| İşlem hattından gelen değer: | True |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-MemberName
Get özelliğini veya çağrılacak yöntemi belirtir.
Joker karakterlere izin verilir, ancak yalnızca sonuçta elde edilen dize benzersiz bir değere çözümlenirse çalışır.
Örneğin, Get-Process | ForEach -MemberName *Nameçalıştırırsanız joker karakter deseni komutun başarısız olmasına neden olan birden fazla üyeyle eşleşir.
Bu parametre Windows PowerShell 3.0'da kullanıma sunulmuştur.
Parametre özellikleri
| Tür: | String |
| Default value: | None |
| Joker karakterleri destekler: | True |
| DontShow: | False |
Parametre kümeleri
PropertyAndMethodSet
| Position: | 0 |
| Zorunlu: | True |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-Parallel
Giriş nesnelerinin paralel işlenmesi için kullanılacak betik bloğunu belirtir. İşlemi açıklayan bir betik bloğu girin.
Bu parametre PowerShell 7.0'da kullanıma sunulmuştur.
Parametre özellikleri
| Tür: | ScriptBlock |
| Default value: | None |
| Joker karakterleri destekler: | False |
| DontShow: | False |
Parametre kümeleri
ParallelParameterSet
| Position: | Named |
| Zorunlu: | True |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-Process
Her giriş nesnesi üzerinde gerçekleştirilen işlemi belirtir. Bu betik bloğu, işlem hattındaki her nesne için çalıştırılır. Blok hakkında process daha fazla bilgi için bkz. about_Functions.
process parametresine birden çok betik bloğu sağladığınızda, ilk betik bloğu her zaman blokla begin eşlenir. Yalnızca iki betik bloğu varsa, ikinci blok process bloğuna eşlenir. Üç veya daha fazla kod bloğu varsa, ilk kod bloğu her zaman bloğa eşlenir begin , son blok bloğa eşlenir end ve aradaki blokların tümü bloğa process eşlenir.
Parametre özellikleri
| Tür: | |
| Default value: | None |
| Joker karakterleri destekler: | False |
| DontShow: | False |
Parametre kümeleri
ScriptBlockSet
| Position: | 0 |
| Zorunlu: | True |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-RemainingScripts
İşlem parametresi tarafından alınmayan tüm betik bloklarını belirtir.
Bu parametre Windows PowerShell 3.0'da kullanıma sunulmuştur.
Parametre özellikleri
| Tür: | |
| Default value: | None |
| Joker karakterleri destekler: | False |
| DontShow: | False |
Parametre kümeleri
ScriptBlockSet
| Position: | Named |
| Zorunlu: | False |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-ThrottleLimit
Paralel olan komut dosyası bloklarının sayısını belirtir. Çalışan betik bloğu sayısı ThrottleLimit'in altına düşene kadar giriş nesneleri engellenir. Varsayılan değer şudur: 5.
Bu parametre PowerShell 7.0'da kullanıma sunulmuştur.
Parametre özellikleri
| Tür: | Int32 |
| Default value: | 5 |
| Joker karakterleri destekler: | False |
| DontShow: | False |
Parametre kümeleri
ParallelParameterSet
| Position: | Named |
| Zorunlu: | False |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-TimeoutSeconds
Tüm girişlerin paralel olarak işlenmesi için beklenecek saniye sayısını belirtir. Belirtilen zaman aşımı süresinden sonra, çalışan tüm betikler durdurulur. İşlenecek kalan giriş nesneleri de yoksayılır. varsayılan değeri 0 zaman aşımını devre dışı bırakır ve ForEach-Object -Parallel süresiz olarak çalıştırılabilir. Komut satırına Ctrl+C yazdıktan sonra çalışan ForEach-Object -Parallel bir komut durdurulur. Bu parametre AsJob parametresiyle birlikte kullanılamaz.
Bu parametre PowerShell 7.0'da kullanıma sunulmuştur.
Parametre özellikleri
| Tür: | Int32 |
| Default value: | 0 |
| Joker karakterleri destekler: | False |
| DontShow: | False |
Parametre kümeleri
ParallelParameterSet
| Position: | Named |
| Zorunlu: | False |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-UseNewRunspace
Paralel çağırmanın, runspace havuzundan çalıştırma boşluklarını yeniden kullanmak yerine her döngü yinelemesi için yeni bir çalışma alanı oluşturmasına neden olur.
Bu parametre PowerShell 7.1'de kullanıma sunulmuştur
Parametre özellikleri
| Tür: | SwitchParameter |
| Default value: | False |
| Joker karakterleri destekler: | False |
| DontShow: | False |
Parametre kümeleri
ParallelParameterSet
| Position: | Named |
| Zorunlu: | False |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
-WhatIf
Cmdlet çalıştırılırsa ne olacağını gösterir. Cmdlet çalıştırılmaz.
Parametre özellikleri
| Tür: | SwitchParameter |
| Default value: | False |
| Joker karakterleri destekler: | False |
| DontShow: | False |
| Diğer adlar: | Wi |
Parametre kümeleri
(All)
| Position: | Named |
| Zorunlu: | False |
| İşlem hattından gelen değer: | False |
| Özellik adına göre işlem hattından gelen değer: | False |
| Kalan bağımsız değişkenlerden elde edilen değer: | False |
CommonParameters
Bu cmdlet yaygın parametreleri destekler: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction ve -WarningVariable. Daha fazla bilgi için bkz. about_CommonParameters.
Girişler
PSObject
Herhangi bir nesneyi bu cmdlet'e yöneltebilirsiniz.
Çıkışlar
PSObject
Bu cmdlet, giriş tarafından belirlenen nesneleri döndürür.
Notlar
ForEach-Object cmdlet'i Foreach deyimine çok benzer, ancak Foreach deyimine giriş kanalı oluşturamazsınız.
Foreach deyimi hakkında daha fazla bilgi için bkz. about_Foreach.
PowerShell 4.0'dan başlayarak koleksiyonlarla kullanılmak üzere Where ve ForEach yöntemleri eklendi. Bu yeni yöntemler hakkında daha fazla bilgiyi burada about_arrays
ForEach-Object -Parallelkullanma:
Parametre
ForEach-Object -Parallelkümesi, her betik bloğunu yeni bir çalışma alanında çalıştırmak için PowerShell'in iç API'sini kullanır. Bu, sıralı işleme ile normal şekilde çalışmaktanForEach-Objectönemli ölçüde daha fazla ek yüktür. Paralel olarak çalıştırmanın ek yükünün, betik bloğunun gerçekleştirdiği işe kıyasla küçük olduğu durumlarda Paralel kullanmak önemlidir. Örneğin:- Çok çekirdekli makinelerde işlem yoğunluklu betikler
- Sonuçları beklemek veya dosya işlemleri yapmak için zaman harcayan betikler
Parallel parametresinin kullanılması betiklerin normalden çok daha yavaş çalışmasına neden olabilir. Özellikle paralel betikler önemsizse. Yararlı olabilecek yerleri keşfetmek için Paralel ile denemeler yapın.
Paralel olarak çalışırken, ScriptProperties veya ScriptMethods ile dekore edilmiş nesnelerin, komut dosyalarının başlangıçta kendilerine eklendiğinden farklı bir çalışma alanında çalıştırılmaları durumunda doğru çalışacakları garanti edilemez.
Scriptblock çağrısı, çağrıldığı yerden bağımsız olarak her zaman kendi giriş çalışma alanında çalıştırmayı dener. Ancak,
ForEach-Object -Parallelkullanımdan sonra silinen geçici çalışma alanları oluşturur, bu nedenle betiklerin artık içinde yürütülecek bir çalışma alanı yoktur.Bu davranış , giriş çalışma alanı hala mevcut olduğu sürece çalışabilir. Ancak betik, giriş çalışma alanında değil yalnızca çağıranın çalışma alanında bulunan dış değişkenlere bağımlıysa istenen sonucu alamayabilirsiniz.
Sonlandırılmayan hatalar, paralel çalışan betik bloklarında oluştukları için cmdlet hata akışına yazılır. Paralel betik engelleme yürütme sırası belirleyici olmadığından, hata akışında hataların görünme sırası rastgeledir. Benzer şekilde, uyarı, ayrıntılı veya bilgi gibi diğer veri akışlarına yazılan iletiler de bu veri akışlarına belirsiz bir sırada yazılır.
Özel durumlar gibi sonlandırma hataları, oluştukları betik bloklarının tek tek paralel örneğini sonlandırır. Bir betik bloğunda sonlandırma hatası cmdlet'in sonlandırılmasına
Foreach-Objectneden olmayabilir. Paralel çalışan diğer betik blokları, sonlandırıcı bir hatayla karşılaşmadıkları sürece çalışmaya devam eder. Sonlandırıcı hata, hata veri akışına errorRecord ve fullyQualifiedErrorId olarakPSTaskExceptionyazılır. Sonlandırma hataları, PowerShell try/catch veya trap blokları kullanılarak sonlandırılmayan hatalara dönüştürülebilir.PipelineVariable ortak parametre değişkenleri, anahtar sözcüğüyle bile paralel senaryolarda
$using:.Önemli
Parametre kümesi,
ForEach-Object -Parallelbetik bloklarını ayrı işlem iş parçacıklarında paralel olarak çalıştırır.$using:anahtar sözcüğü, cmdlet çağırma iş parçacığından çalışan her betik bloğu iş parçacığına değişken başvuruları geçirilmesine olanak tanır. Betik blokları farklı iş parçacıklarında çalıştırıldığından, başvuru tarafından geçirilen nesne değişkenleri güvenli bir şekilde kullanılmalıdır. Genellikle, değişmeyen başvurulan nesnelerden okumak güvenlidir. Ancak nesne durumu değiştiriliyorsa, .NET System.Collection.Concurrent türleri gibi iş parçacığı güvenli nesneler kullanmanız gerekir (Bkz. Örnek 11).