ForEach-Object
Giriş nesneleri koleksiyonundaki her öğeye karşı bir işlem gerçekleştirir.
Syntax
ForEach-Object
[-InputObject <PSObject>]
[-Begin <ScriptBlock>]
[-Process] <ScriptBlock[]>
[-End <ScriptBlock>]
[-RemainingScripts <ScriptBlock[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
ForEach-Object
[-InputObject <PSObject>]
[-MemberName] <String>
[-ArgumentList <Object[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Description
cmdlet'i ForEach-Object
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, komut ForEach-Object
oluşturmanın iki farklı yolu vardır.
Betik bloğu. İşlemi belirtmek için bir betik bloğu kullanabilirsiniz. Betik bloğunun içinde, 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
,process
veend
bloklarını about_functions açıklandığı gibi destekler.Not
Betik blokları çağıranın kapsamında çalışır. Bu nedenle, bloklar bu kapsamdaki değişkenlere erişebilir 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 ProcessName
Ö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, PowerShell yükleme dizinindeki $PSHOME
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.
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
Sistem olay günlüğünden en son 1000 olayı alır ve bunları cmdlet'ine ForEach-Object
aktarır. Begin parametresi geçerli tarih ve saati görüntüler. Ardından İşlem parametresi cmdlet'ini Out-File
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şlemler 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 anahtarlardaki RemotePath kayıt defteri girdisinin HKCU:\Network
değerini büyük harfle değiştirir.
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, sürücüyü ile eşlersenizE:
, içinde RemotePath kayıt defteri değeri olarak ayarlanmış \\Server\Share
bir E alt anahtarı oluşturulur HKCU:\Network
.\\Server\Share
Komutu, her anahtardaki Get-ItemProperty
RemotePath kayıt defteri girdisinin değerini değiştirmek için Ağ anahtarının tüm alt anahtarlarını ve Set-ItemProperty
cmdlet'ini almak 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, REG_SZ dize olan RemotePath değerinin ToUpper() yöntemini kullanır.
Set-ItemProperty
Her anahtarın özelliğini değiştirdiğinden, ForEach-Object
özelliğe erişmek için cmdlet gereklidir.
Örnek 5: $null otomatik değişkenini kullanma
Bu örnek, otomatik değişkeni cmdlet'e $null
bağlamanın ForEach-Object
etkisini gösterir.
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
PowerShell açık bir yer tutucu olarak davrandığından $null
, ForEach-Object
cmdlet'i, kanala alınan diğer nesneler için olduğu gibi için bir değer $null
oluşturur.
Örnek 6: Özellik değerlerini alma
Bu örnek, cmdlet'in MemberName parametresini kullanarak tüm yüklü PowerShell modüllerinin Path özelliğinin ForEach-Object
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-Object
diğer adını kullanır Foreach
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şlecini 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 ArgumentList parametresini kullanır.
Üçüncü komut, cmdlet'in Foreach diğer adını kullanır ve isteğe bağlı olan MemberName ve ArgumentList parametrelerinin adlarını atlar.ForEach-Object
Örnek 8: ForEach-Object'i iki betik bloğuyla kullanma
Bu örnekte, konumsal olarak iki betik bloğu geçiririz. Tüm betik blokları process parametresine bağlanır. Ancak, bunlar Begin ve Process parametrelerine geçirilmiş gibi kabul edilir.
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
Örnek 9: ForEach-Object'i ikiden fazla betik bloğuyla kullanma
Bu örnekte, konumsal olarak dört betik bloğu geçiririz. Tüm betik blokları process parametresine bağlanır. Ancak bunlar Begin, Process ve End parametrelerine geçirilmiş gibi kabul edilir.
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
Not
İlk betik bloğu her zaman blokla begin
eşlenir, son blok blokla end
eşlenir ve iki orta blok blokla 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
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 bkz. about_Splatting.
Bu parametre Windows PowerShell 3.0'da kullanıma sunulmuştur.
Type: | Object[] |
Aliases: | Args |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | 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.
Type: | ScriptBlock |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Confirm
Cmdlet'i çalıştırmadan önce sizden onay ister.
Type: | SwitchParameter |
Aliases: | cf |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | 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.
Type: | ScriptBlock |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | 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ı ForEach-Object
öğesine göndermek yerine ile ForEach-Object
InputObject parametresini kullandığınızda, InputObject değeri tek bir nesne olarak değerlendirilir. Değer gibi -InputObject (Get-Process)
bir komutun sonucu olan bir koleksiyon olsa bile bu doğrudur.
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 için kullanırsanızForEach-Object
, bu konudaki örneklerde gösterildiği gibi işlem hattında kullanmanızı ForEach-Object
öneririz.
Type: | PSObject |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-MemberName
Alınacak üye özelliğinin veya çağrılacak üye yönteminin adını belirtir. Üyelerin statik üyeler değil örnek üyeleri olması gerekir.
Joker karakterlere izin verilir, ancak yalnızca sonuçta elde edilen dize benzersiz bir değere çözümlenirse çalışır.
Örneğin, komutunu çalıştırırsanız Get-Process | ForEach -MemberName *Name
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.
Type: | String |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | True |
-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 blokla process
eşlenir. Üç veya daha fazla betik bloğu varsa, ilk betik bloğu her zaman blokla begin
eşlenir, son blok blokla end
eşlenir ve orta bloklar blokla process
eşlenir.
Type: | ScriptBlock[] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-RemainingScripts
İşlem parametresi tarafından alınmamış tüm betik bloklarını belirtir.
Bu parametre Windows PowerShell 3.0'da kullanıma sunulmuştur.
Type: | ScriptBlock[] |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-WhatIf
Cmdlet çalıştırılıyorsa ne olacağını gösterir. Cmdlet çalıştırılmıyor.
Type: | SwitchParameter |
Aliases: | wi |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Girişler
Herhangi bir nesneyi bu cmdlet'e yöneltebilirsiniz.
Çıkışlar
Bu cmdlet, giriş tarafından belirlenen nesneleri döndürür.
Notlar
Windows PowerShell için aşağıdaki diğer adları ForEach-Object
içerir:
%
foreach
Cmdlet, ForEach-Object
Foreach deyimine çok benzer şekilde çalışır, 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 Where
ForEach
başlayarak koleksiyonlarla kullanılmak üzere yöntemler eklendi. Bu yeni yöntemler hakkında daha fazla bilgiyi burada about_arrays
İlişkili Bağlantılar
PowerShell
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin