$ _ หมายถึงอะไรใน PowerShell


226

ฉันได้เห็นสิ่งต่าง ๆ มากมายใน PowerShell แต่ทำอะไรกันแน่

$_

5
แน่นอนว่าคำถามนั้นได้รับการตอบรับจากโทเค็นพิเศษ แต่สำหรับ Wallchart ที่แสดงโทเค็นพิเศษทั้งหมดของ PowerShell ลองดูที่เครื่องหมายวรรคตอน
Michael Sorens

คำตอบ:


171

นี่คือตัวแปรสำหรับค่าปัจจุบันในเส้นท่อซึ่งเรียกว่า$PSItemใน Powershell 3 และใหม่กว่า

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

หรือ

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

ตัวอย่างเช่นในโค้ดด้านบน%{}บล็อกถูกเรียกใช้สำหรับค่าทุกค่าในอาร์เรย์ $_หรือ$PSItemตัวแปรจะมีมูลค่าปัจจุบัน


42
มันไม่จำเป็นต้องเกี่ยวข้องกับไปป์ไลน์ เป็นมากกว่า "อาร์กิวเมนต์ปัจจุบันของบล็อกสคริปต์ที่กำลังดำเนินการอยู่" ยกตัวอย่างเช่นในขณะที่คุณสามารถใช้งานได้เพียงแค่ปรับในForEach-ObjectหรือWhere-Objectคุณจะไม่สามารถใช้งานได้ในสิ่งที่ต้องการGet-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)- มีท่อเกี่ยวข้อง $_แต่ไม่มีบล็อกสคริปต์และดังนั้นจึงไม่มี (ที่ถูกกล่าวความช่วยเหลือ PowerShell ยังหมายถึงท่อสำหรับ$_. สับสน.)
Joey

@ Joey คุณสามารถใช้ $ _ อย่างในตัวอย่างของคุณ Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Xalorous

@Xalorous: เพียงเพราะมันไม่ได้เกิดข้อผิดพลาดไม่ได้หมายความว่ามันใช้งานได้: Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar... ดีมันสามารถทำงานได้ถ้าคุณมี$_ในขอบเขตที่คุณดำเนินการไปป์ไลน์นั้น แต่นั่นแตกต่างจากสิ่งที่คุณมักจะหมายถึงเมื่อพยายามเขียนสิ่งนั้น
Joey

@ โจอี้$_ในสิ่งที่คุณเขียนด้วยเหตุผลบางอย่างไม่วนลูปผ่านวัตถุทั้งหมด ลองใช้วิธีนี้แทน gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar. ฉันสงสัยว่าการgci | cmdletไม่มี foreach อย่างชัดเจนกำลังรวบรวมผลลัพธ์ gci และส่งอาร์เรย์ไปยัง cmdlet อย่างไรก็ตามอาร์เรย์เป็นวัตถุดังนั้นจึงเป็นการเพิ่มคุณสมบัติให้กับวัตถุอาร์เรย์ อาร์เรย์ไม่มีคุณสมบัติ 'ชื่อ' ดังนั้นค่าที่กำหนดให้กับ $ _. แถบคือ $ null บรรทัดล่างคือ $ _ ถูกใช้อย่างกว้างขวางพร้อมกับการวางท่อ ไม่ต้องการ% {} ในการวนซ้ำเป็นสิ่งใหม่
Xalorous

เวอร์ชันการทำงานพร้อมลบขั้นตอนเพิ่มเติม gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Xalorous

37

ฉันคิดว่าวิธีที่ง่ายที่สุดที่จะคิดเกี่ยวกับตัวแปรนี้เช่นพารามิเตอร์อินพุตในการแสดงออกแลมบ์ดาใน 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

6
ใน C # อย่าใช้_เป็นพารามิเตอร์อินพุตในแลมบ์ดา _บางครั้งใช้เมื่อพารามิเตอร์ถูกละเว้นใช้ x แทน stackoverflow.com/questions/424775/…
Carlos Muñoz

28

ตามเว็บไซต์นี้มีการอ้างอิงถึงthisโดยส่วนใหญ่เป็นลูป

$ _ (เครื่องหมายขีดเส้นใต้ดอลลาร์) โทเค็น 'นี้' โดยทั่วไปหมายถึงรายการภายในวง foreach ภารกิจ: พิมพ์รายการทั้งหมดในคอลเล็กชัน สารละลาย. ... | foreach {เขียน - โฮสต์ $ _}


3
thisเป็นคำที่ค่อนข้างสับสนสำหรับ$_ตัวแปร ใน OOP โดยปกติจะอ้างถึงคลาสไม่ใช่ตัวแปร
o

1
@remco โดยเฉพาะอย่างยิ่งเมื่อ PS v5 เพิ่ม $ ตัวแปรนี้เพื่อใช้ในชั้นเรียน
Xalorous

5

$ _ เป็นนามแฝงสำหรับตัวแปรอัตโนมัติ $ PSItem (แนะนำใน PowerShell V3.0; ข้อมูลการใช้งานพบที่นี่ ) ซึ่งแสดงถึงรายการปัจจุบันจากไปป์

PowerShell (v6.0) เอกสารออนไลน์สำหรับตัวแปรอัตโนมัติที่นี่


1

$ _ เป็นตัวแปรที่วนซ้ำแต่ละวัตถุ / องค์ประกอบที่ส่งผ่านจากก่อนหน้า | (ท่อ).


1

$_เป็นตัวแปรที่สร้างขึ้นโดยระบบมักจะแสดงออกภายในบล็อกที่มีการอ้างอิงโดย cmdlets ที่ใช้กับท่อเช่นและWhere-ObjectForEach-Object

แต่มันสามารถใช้ในนิพจน์ประเภทอื่นเช่นการSelect-Objectรวมกับคุณสมบัติการแสดงออก Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}. ในกรณีนี้$_แสดงถึงไอเท็มที่ถูกไพพ์ แต่สามารถมีหลายนิพจน์ได้

นอกจากนี้ยังสามารถอ้างอิงได้โดยการตรวจสอบความถูกต้องของพารามิเตอร์ที่กำหนดเองซึ่งใช้สคริปต์บล็อกเพื่อตรวจสอบความถูกต้องของค่า ในกรณีนี้$_แสดงถึงค่าพารามิเตอร์ที่ได้รับจากการภาวนา

การเปรียบเทียบกับ c # และ java ที่ใกล้เคียงที่สุดคือนิพจน์ lamda หากคุณทำลาย PowerShell ไปสู่ระดับพื้นฐานทุกอย่างจะเป็นบล็อกสคริปต์ซึ่งรวมถึงไฟล์สคริปต์ a, ฟังก์ชั่นและ cmdlets คุณสามารถกำหนดค่าพารามิเตอร์ของคุณเอง แต่ในบางครั้งหนึ่งที่ถูกสร้างขึ้นโดยระบบสำหรับคุณที่แสดงรายการการป้อนข้อมูลในการประมวลผล / ประเมินผลการศึกษา $_ในสถานการณ์เหล่านั้นตัวแปรอัตโนมัติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.