PowerShell'de $ _ ne anlama geliyor?


Yanıtlar:


171

Bu, boru hattındaki $PSItemPowershell 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 $PSItemdeğişken akım değeri gösterir.


42
Her zaman boru hattıyla ilgili değildir. Daha çok "şu anda yürütülen komut dosyası bloğuna yönelik geçerli bir argüman". Örneğin, iyi bir şekilde kullanabileceğiniz gibi ForEach-Objectveya Where-Objectbö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 $_.)
Joey

@Joey, örneğinizde kesinlikle $ _ kullanabilirsiniz. Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Xalorous

@Xalorous: o işler anlamına gelmez bir hata üretmez diye: 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ı.
Joey

@Yazın $_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 | cmdletAçı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.
Xalorous

Ekstra boru hattı kaldırılmış çalışma sürümü. gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Xalorous

37

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 xde 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

6
C # ' _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/…
Carlos Muñoz

28

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 $ _}


3
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.
o

1
@remco özellikle PS v5 sınıflarda kullanmak için bu değişkeni $ eklediğinde.
Xalorous



1

$_sistem tarafından genellikle Where-Objectve 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-Objectifade ö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 $_.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.