Eu já vi muitas coisas a seguir no PowerShell, mas o que isso faz exatamente?
$_
powershell
Micah
fonte
fonte
Respostas:
Essa é a variável para o valor atual na linha de tubulação, chamada
$PSItem
no Powershell 3 e mais recente.ou
Por exemplo, no código acima, o
%{}
bloco é chamado para todos os valores na matriz. A variável$_
ou$PSItem
conterá o valor atual.fonte
ForEach-Object
ouWhere-Object
em algo comoGet-Foo|Add-Member NoteProperty Bar ($_.SomeProperty)
- há um pipeline envolvido, mas nenhum bloco de script e, portanto, não$_
. (Dito isto, a ajuda PowerShell também se refere ao oleoduto para$_
confuso..)Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $_.SomeProperty
Get-ChildItem | Add-Member -Type NoteProperty -Name Bar -Value $_.Name -PassThru | Select Bar
... Bem, pode funcionar se você tiver um$_
escopo no qual está executando esse pipeline. Mas isso é muito diferente do que você costuma dizer quando tenta escrever algo assim.$_
no que você escreveu é, por algum motivo, não percorrendo todos os objetos. Tente isso em vez disso.gci | % { $_ | add-member -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
. Eu suspeito que tergci | cmdlet
sem o foreach explícito está coletando resultados de gci e passando uma matriz para o cmdlet. No entanto, a matriz é um objeto, portanto, está adicionando uma propriedade ao objeto da matriz. A matriz não possui uma propriedade 'name'; portanto, o valor atribuído a $ _. Bar é $ null. A linha inferior é que $ _ é usado extensivamente com pipelining. Não é necessário que% {} faça o loop é novo.gci | % { add-member -InputObject $_ -Type NoteProperty -Name Bar -Value $_.name -PassThru } | Select Bar
Eu acho que a maneira mais fácil de pensar sobre essa variável como parâmetro de entrada na expressão lambda em c #. Ou seja,
$_
é semelhante aox
emx => Console.WriteLine(x)
função anônima em C #. Considere os seguintes exemplos:PowerShell:
Impressões:
ou
Impressões:
E compare isso com a sintaxe C # usando o LINQ:
Impressões:
ou
Impressões:
fonte
_
como parâmetro de entrada no lambda._
às vezes é usado quando os parâmetros são ignorados, use x. stackoverflow.com/questions/424775/…De acordo com este site, é uma referência
this
, principalmente em loops.fonte
this
é um termo bastante confuso para a$_
variável. No POO, geralmente se refere à classe, não a uma variável.$ _ é um alias para a variável automática $ PSItem (introduzida no PowerShell V3.0; informações de uso encontradas aqui ) que representam o item atual do canal.
A documentação on-line do PowerShell (v6.0) para variáveis automáticas é aqui .
fonte
$ _ é uma variável que itera sobre cada objeto / elemento passado da anterior | (tubo).
fonte
$_
é uma variável criada pelo sistema geralmente dentro de expressões de bloco que são referenciadas por cmdlets usados com pipe, comoWhere-Object
eForEach-Object
.Mas pode ser usado também em outros tipos de expressões, por exemplo,
Select-Object
combinado com propriedades de expressão.Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
. Nesse caso,$_
representa o item que está sendo canalizado, mas podem existir várias expressões.Também pode ser referenciado pela validação de parâmetro personalizado, em que um bloco de script é usado para validar um valor. Nesse caso, o
$_
representa o valor do parâmetro recebido da chamada.A analogia mais próxima de c # e java é a expressão lamda. Se você dividir o PowerShell com o básico, tudo será um bloco de script, incluindo um arquivo de script a, funções e cmdlets. Você pode definir seus próprios parâmetros, mas, em algumas ocasiões, um é criado pelo sistema para você, que representa o item de entrada a ser processado / avaliado . Nessas situações, a variável automática é
$_
.fonte