Я много видел в PowerShell следующее, но что именно он делает?
$_
Я много видел в PowerShell следующее, но что именно он делает?
$_
Ответы:
Это переменная для текущего значения в конвейере, которая вызывается $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
без явного 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:
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. Задача: Распечатать все элементы в коллекции. Решение. ... | foreach {Write-Host $ _}
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, функции и командлеты. Вы можете определить свои собственные параметры, но в некоторых случаях они создаются системой для вас, которая представляет элемент ввода для обработки / оценки . В этих ситуациях автоматическая переменная есть $_
.