2012-10-25 15 views
5

Olası Çoğalt:
What does $_ mean in powershell?

Zaten başkasının question and answer aynı konudaki gördük ama benim için soruya cevap vermez.

Ben Seç-Nesne, nerede-Nesne, ForEach-Nesne vb kullanmak ve örneğin bir komut bloğunu geçmesine biliyorum: Geçerli dizindeki tüm dosya adları dizisi döndürür

dir | ForEach-Object { $_.Name } 

.

Bu, C# 'in Uzantı seç yönteme benzer: sonra listedeki her bir eleman için çalıştırır Select yöntemi için bir işlev geçen çünkü

Dir.Select(x => x.Name) 

Bununla birlikte, yukarıda C# kolayca anlaşılabilir.

Ancak PowerShell eşdeğeri:

dir | ForEach-Object { param($x) $x.Name } 

şey döndürmez. Ancak, beklendiği gibi çalıştığı

& { param($x) $x.Name } (dir)[0] 

çalışır.

Birisi, lütfen $ _ 'ın sihrini C#' ye aşina olan birisine açıklayabilir, ama betimleme dünyasını değil mi? Bu özel bir anahtar kelimedir? Sadece cmdlet'lere aktarılan komut bloklarında kullanılabilir mi? ForEach-Object (ya da başka bir cmdlet) 'a pipetlemeden birini nasıl çağırıyorsunuz? %

+1

numaralı veriyi iletmek için bir yoldur. Bu başka bir sorunun tam kopyası değildir (bu sorunun ilk satırında söylediğim gibi). * Diğer * soru daha fazla veya daha az nasıl * * * ne * ne olduğunu soruyor * ne demek *. Bunun yinelenen bir cevap olmadığını söyleyebilirsin, çünkü kabul edilen cevaplar farklıdır. zdan'ın cevabı, bir şeyi doğrudan bir filtreye pipetlemenin mümkün olduğunu gösterirken, JaredPar'ın cevabı ForEach-Object'e pipetlenmiş bir şeyi gösteriyor. İkisi arasındaki fark, bir filtreyi doğrudan çağırıyor veya bir filtreyi başka bir filtreye geçiriyor. –

cevap

8

$_ yalnızca bir boru hattı bağlamında oluşturulur; bu, çıkış nesnelerinin bir komuttan diğerinin "girdisine" geçirilmesidir. Boru hattı filtreleri için (işlevler gibi), powershell, $_ değişkenini otomatik olarak geçerli boru hattının nesnesiyle doldurur. Şimdi akım dedim çünkü çok sayıda nesnenin boru hattından geçtiğinde, filtrenizin proses komut bloğunun nesne başına bir kez yürütüldüğünü belirtmek önemlidir.

Şimdi, boru hattı nesnelerini sizin giriş parametrelerinizden birine yeniden adlandırabilirsiniz, ancak bunu yaptığınızı bildirmeniz gerekir. Örneğin, komut satırında çok uygun olmayan $ _ otomatik değişkeni için

.

+0

Teşekkürler Bu cevap, $ _'ın ne olduğunu mükemmel bir şekilde açıklıyor. –

2

Geçerli boru satırı öğesi $_'dur.

dir | ForEach-Object { $_.Name } 

Means: Örneğin

  1. Çalıştır dir komutu
  2. sonraki boru hattı komutuna çıktı geçirin
  3. ForEach-Nesne bir şekilde dir çıktı kullanır değişken olarak adlandırılan $ _

dir çıktısından sonra .name mülküne sahipse, boru hattı $_ aynı mülke sahip olacaktır. Bu sadece