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 $PSItemtrong 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 $PSItemsẽ chứa giá trị hiện tại.
ForEach-Objecthoặc Where-Objectbạ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 | cmdletkhô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ư xtrong 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ữ $ _}
thislà 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-Objectvà 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-Objectkế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à $_.