Por que um argumento de script do PowerShell precisou ser copiado para uma variável local?
-
24-09-2019 - |
Pergunta
Eu tenho um script Powershell v1.0 muito simples para encerrar processos por nome:
$target = $args[0]
get-process | where {$_.ProcessName -eq $target} | stop-process -Force
o que funciona.No entanto, quando eu tinha acabado de
get-process | where {$_.ProcessName -eq $args[0]} | stop-process -Force
não encontraria nenhum processo.Então, por que o argumento precisa ser copiado em uma variável local para que o código funcione?
Solução
Isso surgiu ontem em outro publicar.Basicamente um bloco de script { <script> }
obtém seus próprios $args que representam argumentos não nomeados passados para ele, por exemplo:
PS> & { $OFS=', '; "`$args is $args" } arg1 7 3.14 (get-date)
$args is arg1, 7, 3.14, 03/04/2010 09:46:50
O cmdlet Where-Object está usando um scriptblock para fornecer um script arbitrário que é avaliado como verdadeiro ou falso.No caso Where-Object, não há argumentos sem nome passados para o bloco de script, portanto $args deve estar vazio.
Você encontrou uma solução alternativa.O que eu sugeriria é usar um parâmetro nomeado, por exemplo:
param($Name, [switch]$WhatIf)
get-process | where {$_.Name -eq $Name} | stop-process -Force -WhatIf:$WhatIf