Yanıtlar:
Bu, boru hattındaki $PSItem
Powershell 3 ve daha yeni olarak adlandırılan geçerli değer için bir değişkendir .
1,2,3 | %{ write-host $_ }
veya
1,2,3 | %{ write-host $PSItem }
Örneğin yukarıdaki kodda %{}
blok dizideki her değer için çağrılır. $_
Ya da $PSItem
değişken akım değeri gösterir.
ForEach-Object
veya Where-Object
böyle bir şeyde kullanamazsınız Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)
- dahil edilen bir boru hattı var, ancak komut dosyası bloğu yok ve bu nedenle hayır $_
. (Bununla birlikte, PowerShell yardımı için de boru hattına atıfta bulunulmaktadır $_
.)
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar
... Eh, olabilir bir varsa işe $_
o ardışık yürütülürken ediyoruz kapsamında. Ama böyle bir şey yazmaya çalışırken genellikle kastettiğinizden çok farklı.
$_
yazdığın şeyde , bir nedenden dolayı, tüm nesneler arasında dolaşmamak . Bunun yerine bunu deneyin. gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
. gci | cmdlet
Açık foreach olmadan sahip olmak gci sonuçları toplamak ve cmdlet bir dizi geçiriyor sanıyorum. Ancak, dizi bir nesnedir, bu nedenle dizi nesnesine bir özellik ekler. Dizinin 'name' özelliği yoktur, bu nedenle $ _ öğesine atanan değer $ null olur. Alt satırda, $ _, boru hattı ile yaygın olarak kullanılmaktadır. Dönmesi için% {} gerekmez yeni.
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Ben C # lambda ifadesinde giriş parametresi gibi bu değişken hakkında düşünmek için en kolay yolu düşünüyorum. Yani $_
benzer x
de x => Console.WriteLine(x)
C # anonim fonksiyonu. Aşağıdaki örnekleri düşünün:
Güç kalkanı:
1,2,3 | ForEach-Object {Write-Host $_}
Baskılar:
1
2
3
veya
1,2,3 | Where-Object {$_ -gt 1}
Baskılar:
2
3
Ve bunu LINQ kullanarak C # sözdizimi ile karşılaştırın:
var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));
Baskılar:
1
2
3
veya
list.Where( _ => _ > 1)
.ToList()
.ForEach(s => Console.WriteLine(s));
Baskılar:
2
3
_
da lambda'da giriş parametresi olarak kullanmayın . _
bazen parametreler yoksayıldığında kullanılır, bunun yerine x kullanın. stackoverflow.com/questions/424775/…
Bu web sitesine göre this
, çoğunlukla döngülerde bir referans .
$ _ (dolar alt çizgi) 'BU' jetonu. Genellikle bir foreach döngüsü içindeki öğeyi ifade eder. Görev: Bir koleksiyondaki tüm öğeleri yazdırın. Çözüm. ... | foreach {Yazma-Sunucusu $ _}
this
$_
değişken için oldukça kafa karıştırıcı bir terimdir . OOP'de genellikle bir değişken değil, sınıfa karşılık gelir.
$ _, borudaki geçerli öğeyi temsil eden otomatik değişken $ PSItem (PowerShell V3.0'da tanıtıldı; burada bulunan kullanım bilgileri ) için bir takma addır .
Otomatik değişkenler için PowerShell (v6.0) çevrimiçi belgeleri burada .
$_
sistem tarafından genellikle Where-Object
ve gibi boru ile kullanılan cmdlet'ler tarafından başvurulan blok ifadelerinin içinde oluşturulan bir değişkendir ForEach-Object
.
Ancak, başka ifade türlerinde de kullanılabilir, örneğin Select-Object
ifade özellikleriyle birlikte. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
. Bu durumda, $_
temsil edilen öğe temsil edilir, ancak birden çok ifade bulunabilir.
Ayrıca, bir değeri doğrulamak için bir komut dosyası bloğunun kullanıldığı özel parametre doğrulamasıyla da başvurulabilir. Bu durumda $_
, çağırmadan alınan parametre değerini temsil eder.
C # ve java'ya en yakın benzetme lamda ifadesidir. Powershell'i temellere ayırırsanız, her şey bir komut dosyası a, fonksiyonlar ve cmdlet'ler içeren bir komut dosyası bloğudur. Kendi parametrelerinizi tanımlayabilirsiniz, ancak bazı durumlarda sistem tarafından sizin için işlenecek / değerlendirilecek girdi öğesini temsil eden bir tane oluşturulur . Bu durumlarda otomatik değişken $_
.