Почему аргумент сценария PowerShell необходимо скопировать в локальную переменную? - PullRequest
2 голосов
/ 04 марта 2010

У меня есть очень простой скрипт Powershell v1.0 для уничтожения процессов по имени:

$target = $args[0]
get-process | where {$_.ProcessName -eq $target} | stop-process -Force

который работает. Однако, когда у меня только что было

get-process | where {$_.ProcessName -eq $args[0]} | stop-process -Force

он не найдет никаких процессов. Так почему же аргумент нужно скопировать в локальную переменную, чтобы код работал?

1 Ответ

5 голосов
/ 04 марта 2010

Это появилось вчера в другом посте . По сути, скрипт-блок { <script> } получает свои собственные $ args, которые представляют безымянные аргументы, передаваемые в него, например ::

PS> & { $OFS=', '; "`$args is $args" } arg1 7 3.14 (get-date)
$args is arg1, 7, 3.14, 03/04/2010 09:46:50

Командлет Where-Object использует блок сценариев для предоставления произвольного сценария, который оценивается как true или false. В случае Where-Object в блок скриптов не передаются безымянные аргументы, поэтому $ args должен быть пустым.

Вы нашли один обходной путь. Я бы предложил использовать именованный параметр, например:

param($Name, [switch]$WhatIf)
get-process | where {$_.Name -eq $Name} | stop-process -Force -WhatIf:$WhatIf
...