Что означает $_ в PowerShell?
Я много видел в PowerShell следующее, но что именно он делает?
$_
7 ответов
Это переменная для текущего значения в конвейере, которая называется $PSItem
в Powershell 3 и новее.
1,2,3 | %{ write-host $_ }
или же
1,2,3 | %{ write-host $PSItem }
Например, в приведенном выше коде %{}
Блок вызывается для каждого значения в массиве. $_
или же $PSItem
переменная будет содержать текущее значение.
Я думаю, что самый простой способ думать об этой переменной, как входной параметр в лямбда-выражении в 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
Согласно этому сайту, это ссылка на this
в основном в петлях.
$ _ (подчеркивание доллара) токен "ЭТО". Обычно относится к элементу внутри цикла foreach. Задача: Распечатать все элементы в коллекции. Решение. ... | foreach { Write-Host $_ }
$_ - это псевдоним автоматической переменной $PSItem (представлен в PowerShell V3.0; здесь приведена информация об использовании), которая представляет текущий элемент из канала.
Онлайн-документация PowerShell (v6.0) для автоматических переменных находится здесь.
$_
переменная, созданная системой, обычно внутри блочных выражений, на которые ссылаются командлеты, используемые с конвейером, такие как Where-Object
а также ForEach-Object
,
Но это может быть использовано и в других типах выражений, например, с Select-Object
в сочетании со свойствами выражения. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
, В этом случае $_
представляет передаваемый элемент, но может существовать несколько выражений.
На него также может ссылаться проверка пользовательских параметров, когда для проверки значения используется блок сценария. В этом случае $_
представляет значение параметра, полученное из вызова.
Ближайшая аналогия C# и java - это выражение lamda. Если вы разберетесь с PowerShell до основ, то все будет блоком скрипта, включая файл скрипта a, функции и командлеты. Вы можете определить свои собственные параметры, но в некоторых случаях они создаются системой для вас, которая представляет элемент ввода для обработки / оценки. В этих ситуациях автоматическая переменная $_
,
$_ - это переменная, которая перебирает каждый объект / элемент, переданный из предыдущего | (Труба).
$_ — это $PSItem, который, по сути, является объектом, переданным из другой команды. Например, запуск Get-Volume на моих рабочих станциях возвращает строки PSItems или объекты.
get-volume | select driveLetter,DriveType
driveLetter DriveType
----------- ---------
D Fixed
Fixed
C Fixed
A Removable
Driveletter и DriveType являются свойствами. Теперь вы можете использовать эти свойства элемента при передаче вывода с помощью $_.(propertyName). (Также помните, что % — это псевдоним Foreach-Object) Например.
$vol = get-volume | select driveLetter,DriveType
$vol | Foreach-Object {
if($_.DriveType -eq "Fixed") {
"$($_.driveLetter) is $($_.driveType)"}
else{
"$($_.driveLetter) is $($_.driveType)"
}
}
Используя Terinary в Powershell 7, я могу сократить логику, используя свойства из Piped PSItem.