Я много видел в PowerShell следующее, но что именно он делает?
$_
powershell
Михей
источник
источник
Ответы:
Это переменная для текущего значения в конвейере, которая вызывается
$PSItem
в Powershell 3 и новее.или
Например, в приведенном выше коде
%{}
блок вызывается для каждого значения в массиве.$_
Или$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
без явного foreach собирает результаты gci и передает массив командлету. Однако массив является объектом, поэтому он добавляет свойство к объекту массива. Массив не имеет свойства name, поэтому значение, присвоенное $ _. Bar, равно $ null. Суть в том, что $ _ широко используется с конвейеризацией. Не нужно% {}, чтобы пройти через это новый.gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Я думаю, что самый простой способ думать об этой переменной, как входной параметр в лямбда-выражении в C #. Т.е.
$_
аналогичноx
вx => Console.WriteLine(x)
анонимной функции в C #. Рассмотрим следующие примеры:PowerShell:
Печать:
или
Печать:
И сравните это с синтаксисом C #, используя LINQ:
Печать:
или
Печать:
источник
_
качестве входного параметра в лямбду._
иногда используется, когда параметры игнорируются, вместо этого используйте x. stackoverflow.com/questions/424775/…Согласно этому сайту, это ссылка
this
, в основном, в петлях.источник
this
довольно запутанный термин для$_
переменной. В ООП это обычно относится к классу, а не к переменной.$ _ - это псевдоним автоматической переменной $ 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, функции и командлеты. Вы можете определить свои собственные параметры, но в некоторых случаях они создаются системой для вас, которая представляет элемент ввода для обработки / оценки . В этих ситуациях автоматическая переменная есть
$_
.источник