Saya telah melihat banyak hal berikut di PowerShell, tetapi apa fungsinya sebenarnya?
$_
powershell
Mikha
sumber
sumber
Jawaban:
Ini adalah variabel untuk nilai saat ini di jalur pipa, yang disebut
$PSItem
di Powershell 3 dan yang lebih baru.atau
Sebagai contoh dalam kode di atas,
%{}
blok dipanggil untuk setiap nilai dalam array. The$_
atau$PSItem
variabel akan berisi nilai saat ini.sumber
ForEach-Object
atauWhere-Object
Anda tidak dapat menggunakannya dalam sesuatu sepertiGet-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 memilikigci | 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 denganx
dalamx => Console.WriteLine(x)
fungsi anonim di C #. Pertimbangkan contoh-contoh berikut:PowerShell:
Cetakan:
atau
Cetakan:
Dan bandingkan ini dengan sintaks C # menggunakan LINQ:
Cetakan:
atau
Cetakan:
sumber
_
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.sumber
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 .
sumber
$ _ adalah variabel yang diulangi pada setiap objek / elemen yang diteruskan dari sebelumnya | (pipa).
sumber
$_
adalah variabel yang dibuat oleh sistem biasanya di dalam ekspresi blok yang dirujuk oleh cmdlet yang digunakan dengan pipa sepertiWhere-Object
danForEach-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
$_
.sumber