Por que um argumento de script do PowerShell precisou ser copiado para uma variável local?

StackOverflow https://stackoverflow.com/questions/2380934

  •  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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top