Apa arti $ _ dalam PowerShell?

226

Saya telah melihat banyak hal berikut di PowerShell, tetapi apa fungsinya sebenarnya?

$_
Mikha
sumber
5
Pertanyaannya, tentu saja, telah dijawab untuk satu tanda khusus yang diberikan, tetapi untuk bagan dinding yang menggambarkan semua token khusus PowerShell, lihat Panduan Lengkap untuk Tanda baca PowerShell
Michael Sorens

Jawaban:

171

Ini adalah variabel untuk nilai saat ini di jalur pipa, yang disebut $PSItemdi Powershell 3 dan yang lebih baru.

1,2,3 | %{ write-host $_ } 

atau

1,2,3 | %{ write-host $PSItem } 

Sebagai contoh dalam kode di atas, %{}blok dipanggil untuk setiap nilai dalam array. The $_atau $PSItemvariabel akan berisi nilai saat ini.

JaredPar
sumber
42
Itu belum tentu terkait dengan pipa. Ini lebih merupakan "argumen saat ini untuk blok skrip yang saat ini mengeksekusi". Misalnya saat Anda dapat menggunakannya dengan baik ForEach-Objectatau Where-ObjectAnda tidak dapat menggunakannya dalam sesuatu seperti Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)- ada pipa yang terlibat, tetapi tidak ada blok skrip dan karenanya tidak $_. (Yang sedang berkata, bantuan PowerShell juga mengacu pada pipa untuk $_. Membingungkan.)
Joey
@ Joey, Anda benar-benar dapat menggunakan $ _ dalam contoh Anda. Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Xalorous
@ Xororous: Hanya karena tidak menghasilkan kesalahan, bukan berarti ia berfungsi: Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar... Ya, itu bisa bekerja jika Anda memiliki ruang $_lingkup di mana Anda menjalankan pipa itu. Tapi itu sangat berbeda dari yang biasanya Anda maksud ketika mencoba menulis sesuatu seperti itu.
Joey
@ Joey $_dalam apa yang Anda tulis adalah, untuk beberapa alasan, tidak mengulangi semua objek. Coba ini sebagai gantinya. gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar. Saya menduga bahwa memiliki gci | cmdlettanpa foreach eksplisit mengumpulkan hasil gci dan meneruskan array ke cmdlet. Namun, array adalah objek, jadi itu menambahkan properti ke objek array. Array tidak memiliki properti 'name', jadi nilai yang ditetapkan untuk $ _. Bar adalah $ null. Intinya adalah bahwa $ _ digunakan secara luas dengan pipelining. Tidak perlu% {} untuk mengulang adalah baru.
Xalorous
Versi yang berfungsi dengan pipa tambahan dihapus. gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Xalorous
37

Saya pikir cara termudah untuk memikirkan variabel ini seperti parameter input dalam ekspresi lambda di C #. Yaitu $_mirip dengan xdalam x => Console.WriteLine(x)fungsi anonim di C #. Pertimbangkan contoh-contoh berikut:

PowerShell:

1,2,3 | ForEach-Object {Write-Host $_}

Cetakan:

1
2
3

atau

1,2,3 | Where-Object {$_ -gt 1}

Cetakan:

2
3

Dan bandingkan ini dengan sintaks C # menggunakan LINQ:

var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));

Cetakan:

1
2
3

atau

list.Where( _ => _ > 1)
    .ToList()
    .ForEach(s => Console.WriteLine(s));

Cetakan:

2
3
Sergey Teplyakov
sumber
6
Dalam C # jangan gunakan _sebagai parameter input di lambda. _terkadang digunakan ketika parameter diabaikan, gunakan x sebagai gantinya. stackoverflow.com/questions/424775/…
Carlos Muñoz
28

Menurut situs web ini , ini adalah rujukan this, sebagian besar dalam loop.

$ _ (dolar menggarisbawahi) token 'INI'. Biasanya merujuk pada item di dalam foreach loop. Tugas: Cetak semua item dalam koleksi. Larutan. ... | foreach {Write-Host $ _}

Ikke
sumber
3
thisadalah istilah yang agak membingungkan untuk $_variabel. Dalam OOP biasanya merujuk ke kelas, bukan variabel.
o
1
@remco terutama ketika PS v5 menambahkan $ variabel ini untuk digunakan di kelas.
Xalorous
5

$ _ adalah alias untuk variabel otomatis $ PSItem (diperkenalkan di PowerShell V3.0; Informasi penggunaan ditemukan di sini ) yang mewakili item saat ini dari pipa.

Dokumentasi online PowerShell (v6.0) untuk variabel otomatis ada di sini .

Xalorous
sumber
1

$ _ adalah variabel yang diulangi pada setiap objek / elemen yang diteruskan dari sebelumnya | (pipa).

Tagihan
sumber
1

$_adalah variabel yang dibuat oleh sistem biasanya di dalam ekspresi blok yang dirujuk oleh cmdlet yang digunakan dengan pipa seperti Where-Objectdan ForEach-Object.

Tetapi dapat digunakan juga dalam jenis ekspresi lain, misalnya dengan Select-Objectdikombinasikan dengan properti ekspresi. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}. Dalam kasus ini $_, item mewakili piped tetapi banyak ekspresi dapat ada.

Itu juga dapat dirujuk oleh validasi parameter khusus, di mana blok skrip digunakan untuk memvalidasi nilai. Dalam hal ini $_mewakili nilai parameter yang diterima dari doa.

Analogi terdekat dengan c # dan java adalah ekspresi lamda. Jika Anda memecah PowerShell ke dasar-dasar maka semuanya adalah blok skrip termasuk file skrip a, fungsi dan cmdlet. Anda dapat menentukan parameter Anda sendiri tetapi dalam beberapa kesempatan seseorang dibuat oleh sistem untuk Anda yang mewakili item input untuk diproses / dievaluasi . Dalam situasi itu, variabel otomatis adalah $_.

Alex Sarafian
sumber