Tôi đã thấy rất nhiều điều sau đây trong PowerShell, nhưng chính xác thì nó làm gì?
$_
Tôi đã thấy rất nhiều điều sau đây trong PowerShell, nhưng chính xác thì nó làm gì?
$_
Câu trả lời:
Đây là biến cho giá trị hiện tại trong đường ống, được gọi $PSItem
trong Powershell 3 và mới hơn.
1,2,3 | %{ write-host $_ }
hoặc là
1,2,3 | %{ write-host $PSItem }
Ví dụ trong đoạn mã trên, %{}
khối được gọi cho mọi giá trị trong mảng. Biến $_
hoặc $PSItem
sẽ chứa giá trị hiện tại.
ForEach-Object
hoặc Where-Object
bạn không thể sử dụng nó trong một cái gì đó như Get-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)
- có một đường ống liên quan, nhưng không có khối kịch bản và do đó không $_
. (Điều đó đang được nói, trợ giúp PowerShell cũng đề cập đến đường ống dẫn $_
. Khó hiểu.)
Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar
... Chà, nó có thể hoạt động nếu bạn có $_
trong phạm vi mà bạn đang thực hiện đường ống đó. Nhưng điều đó rất khác so với những gì bạn thường nói khi cố gắng viết một cái gì đó như thế.
$_
trong những gì bạn đã viết, vì một số lý do, không lặp qua tất cả các đối tượng. Hãy thử điều này thay thế. gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
. Tôi nghi ngờ rằng việc gci | cmdlet
không có foreach rõ ràng sẽ thu thập kết quả gci và chuyển một mảng cho lệnh ghép ngắn. Tuy nhiên, mảng là một đối tượng, vì vậy nó thêm một thuộc tính vào đối tượng mảng. Mảng không có thuộc tính 'name', vì vậy giá trị được gán cho $ _. Bar là $ null. Điểm mấu chốt là $ _ được sử dụng rộng rãi w / pipelining. Không cần% {} để lặp qua là mới.
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Tôi nghĩ cách dễ nhất để suy nghĩ về biến này như tham số đầu vào trong biểu thức lambda trong C #. Tức $_
là tương tự như x
trong x => Console.WriteLine(x)
chức năng ẩn danh trong C #. Xem xét các ví dụ sau:
PowerShell:
1,2,3 | ForEach-Object {Write-Host $_}
Bản in:
1
2
3
hoặc là
1,2,3 | Where-Object {$_ -gt 1}
Bản in:
2
3
Và so sánh điều này với cú pháp C # bằng LINQ:
var list = new List<int> { 1, 2, 3 };
list.ForEach( _ => Console.WriteLine( _ ));
Bản in:
1
2
3
hoặc là
list.Where( _ => _ > 1)
.ToList()
.ForEach(s => Console.WriteLine(s));
Bản in:
2
3
_
làm tham số đầu vào trong lambda. _
đôi khi được sử dụng khi các tham số bị bỏ qua, thay vào đó sử dụng x. stackoverflow.com/questions/424775/ Mạnh
Theo trang web này , nó là một tài liệu tham khảo this
, chủ yếu là các vòng lặp.
$ _ (đô la gạch dưới) mã thông báo 'NÀY'. Thông thường đề cập đến các mục bên trong một vòng lặp foreach. Nhiệm vụ: In tất cả các mục trong một bộ sưu tập. Giải pháp. ... | foreach {Viết-lưu trữ $ _}
this
là một thuật ngữ khá khó hiểu cho $_
biến. Trong OOP, nó thường đề cập đến lớp, không phải là một biến.
$ _ là bí danh cho biến tự động $ PSItem (được giới thiệu trong PowerShell V3.0; Thông tin sử dụng được tìm thấy ở đây ) đại diện cho mục hiện tại từ đường ống.
Tài liệu trực tuyến PowerShell (v6.0) cho các biến tự động có ở đây .
$_
là một biến được tạo bởi hệ thống thường bên trong các biểu thức khối được tham chiếu bởi các lệnh ghép ngắn được sử dụng với đường ống như Where-Object
và ForEach-Object
.
Nhưng nó cũng có thể được sử dụng trong các loại biểu thức khác, ví dụ như Select-Object
kết hợp với các thuộc tính biểu thức. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
. Trong trường hợp này, $_
đại diện cho mục được dẫn nhưng nhiều biểu thức có thể tồn tại.
Nó cũng có thể được tham chiếu bằng xác thực tham số tùy chỉnh, trong đó một khối tập lệnh được sử dụng để xác thực một giá trị. Trong trường hợp này, $_
đại diện cho giá trị tham số như nhận được từ lời gọi.
Sự tương tự gần nhất với c # và java là biểu thức lamda. Nếu bạn chia nhỏ quyền hạn thành cơ bản thì mọi thứ là một khối tập lệnh bao gồm tệp tập lệnh a, hàm và lệnh ghép ngắn. Bạn có thể xác định các tham số của riêng mình nhưng trong một số trường hợp, một hệ thống được tạo bởi bạn đại diện cho mục đầu vào để xử lý / đánh giá . Trong những tình huống đó, biến tự động là $_
.