Что означает $ _ в PowerShell? - PullRequest
       56

Что означает $ _ в PowerShell?

212 голосов
/ 16 августа 2010

Я часто видел следующее в PowerShell, но что он делает точно?

$_

Ответы [ 6 ]

157 голосов
/ 16 августа 2010

Это переменная для текущего значения в конвейере, которая называется $PSItem в Powershell 3 и новее.

1,2,3 | %{ write-host $_ } 

или

1,2,3 | %{ write-host $PSItem } 

Например, в приведенном выше коде блок %{} вызывается для каждого значения в массиве. Переменная $_ или $PSItem будет содержать текущее значение.

36 голосов
/ 21 августа 2010

Я думаю, что самый простой способ думать об этой переменной, как входной параметр в лямбда-выражении в 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
27 голосов
/ 16 августа 2010

Согласно этому веб-сайту, это ссылка на this, в основном в циклах.

$ _ (подчеркивание доллара) «ЭТОТ» жетон. Обычно относится к элемент внутри цикла foreach. Задача: Распечатать все предметы в коллекции. Решение. ... | foreach {Write-Host $ _}

4 голосов
/ 06 ноября 2015

$ _ - это псевдоним автоматической переменной $ PSItem (представлен в PowerShell V3.0; Информация об использовании, найденная здесь ), которая представляет текущий элемент из канала.

PowerShell (v6.0) электронная документация для автоматических переменных: здесь .

1 голос
/ 31 августа 2010

$ _ - это переменная, которая перебирает каждый объект / элемент, переданный из предыдущего | (Труба).

0 голосов
/ 05 апреля 2017

$_ - это переменная, создаваемая системой, обычно внутри блочных выражений, на которые ссылаются командлеты, которые используются с конвейером, например Where-Object и ForEach-Object.

Но его можно использовать и в других типах выражений, например, с Select-Object в сочетании со свойствами выражений. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}. В этом случае $_ представляет передаваемый элемент, но может существовать несколько выражений.

На него также может ссылаться валидация пользовательских параметров, где для проверки значения используется блок скрипта. В этом случае $_ представляет значение параметра, полученное из вызова.

Ближайшая аналогия c # и java - это выражение lamda. Если вы разберетесь с PowerShell до основ, то все будет блоком скрипта, включая файл скрипта a, функции и командлеты. Вы можете определить свои собственные параметры, но в некоторых случаях для вас создается система, которая представляет элемент ввода для обработки / оценки . В этих ситуациях автоматической переменной является $_.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...