Saya telah melihat banyak hal berikut di PowerShell, tetapi apa fungsinya sebenarnya?
$_
Saya telah melihat banyak hal berikut di PowerShell, tetapi apa fungsinya sebenarnya?
$_
Jawaban:
Ini adalah variabel untuk nilai saat ini di jalur pipa, yang disebut $PSItem
di 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 $PSItem
variabel akan berisi nilai saat ini.
ForEach-Object
atau Where-Object
Anda 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.)
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
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.
$_
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 | cmdlet
tanpa 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.
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Saya pikir cara termudah untuk memikirkan variabel ini seperti parameter input dalam ekspresi lambda di C #. Yaitu $_
mirip dengan x
dalam 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
_
sebagai parameter input di lambda. _
terkadang digunakan ketika parameter diabaikan, gunakan x sebagai gantinya. stackoverflow.com/questions/424775/…
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 $ _}
this
adalah istilah yang agak membingungkan untuk $_
variabel. Dalam OOP biasanya merujuk ke kelas, bukan variabel.
$ _ 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 .
$_
adalah variabel yang dibuat oleh sistem biasanya di dalam ekspresi blok yang dirujuk oleh cmdlet yang digunakan dengan pipa seperti Where-Object
dan ForEach-Object
.
Tetapi dapat digunakan juga dalam jenis ekspresi lain, misalnya dengan Select-Object
dikombinasikan 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 $_
.