Что означает $_ в 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.

Другие вопросы по тегам