ฉันได้เห็นสิ่งต่าง ๆ มากมายใน PowerShell แต่ทำอะไรกันแน่
$_
ฉันได้เห็นสิ่งต่าง ๆ มากมายใน PowerShell แต่ทำอะไรกันแน่
$_
คำตอบ:
นี่คือตัวแปรสำหรับค่าปัจจุบันในเส้นท่อซึ่งเรียกว่า$PSItem
ใน Powershell 3 และใหม่กว่า
1,2,3 | %{ write-host $_ }
หรือ
1,2,3 | %{ write-host $PSItem }
ตัวอย่างเช่นในโค้ดด้านบน%{}
บล็อกถูกเรียกใช้สำหรับค่าทุกค่าในอาร์เรย์ $_
หรือ$PSItem
ตัวแปรจะมีมูลค่าปัจจุบัน
ForEach-Object
หรือWhere-Object
คุณจะไม่สามารถใช้งานได้ในสิ่งที่ต้องการGet-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)
- มีท่อเกี่ยวข้อง $_
แต่ไม่มีบล็อกสคริปต์และดังนั้นจึงไม่มี (ที่ถูกกล่าวความช่วยเหลือ PowerShell ยังหมายถึงท่อสำหรับ$_
. สับสน.)
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar
... ดีมันสามารถทำงานได้ถ้าคุณมี$_
ในขอบเขตที่คุณดำเนินการไปป์ไลน์นั้น แต่นั่นแตกต่างจากสิ่งที่คุณมักจะหมายถึงเมื่อพยายามเขียนสิ่งนั้น
$_
ในสิ่งที่คุณเขียนด้วยเหตุผลบางอย่างไม่วนลูปผ่านวัตถุทั้งหมด ลองใช้วิธีนี้แทน gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
. ฉันสงสัยว่าการgci | cmdlet
ไม่มี foreach อย่างชัดเจนกำลังรวบรวมผลลัพธ์ gci และส่งอาร์เรย์ไปยัง cmdlet อย่างไรก็ตามอาร์เรย์เป็นวัตถุดังนั้นจึงเป็นการเพิ่มคุณสมบัติให้กับวัตถุอาร์เรย์ อาร์เรย์ไม่มีคุณสมบัติ 'ชื่อ' ดังนั้นค่าที่กำหนดให้กับ $ _. แถบคือ $ null บรรทัดล่างคือ $ _ ถูกใช้อย่างกว้างขวางพร้อมกับการวางท่อ ไม่ต้องการ% {} ในการวนซ้ำเป็นสิ่งใหม่
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
ฉันคิดว่าวิธีที่ง่ายที่สุดที่จะคิดเกี่ยวกับตัวแปรนี้เช่นพารามิเตอร์อินพุตในการแสดงออกแลมบ์ดาใน C # Ie $_
คล้ายกับx
ในx => Console.WriteLine(x)
ฟังก์ชันที่ไม่ระบุชื่อใน C # ลองพิจารณาตัวอย่างต่อไปนี้:
PowerShell:
1,2,3 | ForEach-Object {Write-Host $_}
พิมพ์:
1
2
3
หรือ
1,2,3 | Where-Object {$_ -gt 1}
พิมพ์:
2
3
และเปรียบเทียบสิ่งนี้กับไวยากรณ์ C # โดยใช้ LINQ:
var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));
พิมพ์:
1
2
3
หรือ
list.Where( _ => _ > 1)
.ToList()
.ForEach(s => Console.WriteLine(s));
พิมพ์:
2
3
_
เป็นพารามิเตอร์อินพุตในแลมบ์ดา _
บางครั้งใช้เมื่อพารามิเตอร์ถูกละเว้นใช้ x แทน stackoverflow.com/questions/424775/…
ตามเว็บไซต์นี้มีการอ้างอิงถึงthis
โดยส่วนใหญ่เป็นลูป
$ _ (เครื่องหมายขีดเส้นใต้ดอลลาร์) โทเค็น 'นี้' โดยทั่วไปหมายถึงรายการภายในวง foreach ภารกิจ: พิมพ์รายการทั้งหมดในคอลเล็กชัน สารละลาย. ... | foreach {เขียน - โฮสต์ $ _}
this
เป็นคำที่ค่อนข้างสับสนสำหรับ$_
ตัวแปร ใน OOP โดยปกติจะอ้างถึงคลาสไม่ใช่ตัวแปร
$ _ เป็นนามแฝงสำหรับตัวแปรอัตโนมัติ $ PSItem (แนะนำใน PowerShell V3.0; ข้อมูลการใช้งานพบที่นี่ ) ซึ่งแสดงถึงรายการปัจจุบันจากไปป์
$ _ เป็นตัวแปรที่วนซ้ำแต่ละวัตถุ / องค์ประกอบที่ส่งผ่านจากก่อนหน้า | (ท่อ).
$_
เป็นตัวแปรที่สร้างขึ้นโดยระบบมักจะแสดงออกภายในบล็อกที่มีการอ้างอิงโดย cmdlets ที่ใช้กับท่อเช่นและWhere-Object
ForEach-Object
แต่มันสามารถใช้ในนิพจน์ประเภทอื่นเช่นการSelect-Object
รวมกับคุณสมบัติการแสดงออก Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
. ในกรณีนี้$_
แสดงถึงไอเท็มที่ถูกไพพ์ แต่สามารถมีหลายนิพจน์ได้
นอกจากนี้ยังสามารถอ้างอิงได้โดยการตรวจสอบความถูกต้องของพารามิเตอร์ที่กำหนดเองซึ่งใช้สคริปต์บล็อกเพื่อตรวจสอบความถูกต้องของค่า ในกรณีนี้$_
แสดงถึงค่าพารามิเตอร์ที่ได้รับจากการภาวนา
การเปรียบเทียบกับ c # และ java ที่ใกล้เคียงที่สุดคือนิพจน์ lamda หากคุณทำลาย PowerShell ไปสู่ระดับพื้นฐานทุกอย่างจะเป็นบล็อกสคริปต์ซึ่งรวมถึงไฟล์สคริปต์ a, ฟังก์ชั่นและ cmdlets คุณสามารถกำหนดค่าพารามิเตอร์ของคุณเอง แต่ในบางครั้งหนึ่งที่ถูกสร้างขึ้นโดยระบบสำหรับคุณที่แสดงรายการการป้อนข้อมูลในการประมวลผล / ประเมินผลการศึกษา $_
ในสถานการณ์เหล่านั้นตัวแปรอัตโนมัติ