Відповіді:
Це змінна для поточного значення в трубопроводі, яка називається $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
без явного передбачення збирає результати gci і передає масив командлету. Однак масив є об’єктом, тому він додає властивість до об’єкта масиву. У масиві немає властивості 'name', тому значення, присвоєне $ _. Бар є $ null. Підсумок полягає в тому, що $ _ широко використовується з / по трубопроводу. Не потрібно% {} для перегляду циклу - це нове.
gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Я думаю, що найпростіший спосіб подумати про цю змінну, як вхідний параметр у лямбда-виразі в C #. Тобто $_
аналогічно 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 {Write-Host $ _}
this
є досить заплутаним терміном для $_
змінної. В OOP він зазвичай посилається на клас, а не на змінну.
$ _ - псевдонім для автоматичної змінної $ PSItem (представлений в PowerShell V3.0; тут використовується інформація про використання ), яка представляє поточний елемент з труби.
Електронна документація PowerShell (v6.0) для автоматичних змінних тут .
$_
являє собою змінну, створену системою, як правило, всередині виразів блоків, на які посилаються командлети, які використовуються з трубою, такою як Where-Object
і ForEach-Object
.
Але його можна використовувати і в інших видах виразів, наприклад, у Select-Object
поєднанні з властивостями експресії. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
. У цьому випадку $_
представляє елемент, який перебуває в трубі, але може існувати декілька виразів.
На нього можна також посилатись за допомогою валідації спеціальних параметрів, де блок скриптів використовується для перевірки значення. У цьому випадку a $_
представляє значення параметра, отримане від виклику.
Найближча аналогія c # і java - це вираз lamda. Якщо ви розбиваєте повноваження на основи, то все є блоком скриптів, включаючи файл сценарію a, функції та командлети. Ви можете визначити власні параметри, але в деяких випадках система створюється для вас, яка представляє елемент введення для обробки / оцінки . У таких ситуаціях автоматична змінна є $_
.