Каждый блок сценария ({ ... }
) в PowerShell имеет свою собственную копию автомата c $args
массива , в который автоматически собираются позиционно переданные аргументы.
Следовательно, $args
внутри {$_.id -eq "$($args[$i])"}
равно , а не то же, что $args
на уровне сценария, поэтому вам действительно нужно сначала сохранить значение уровня сценария во вспомогательной переменной, так как во втором фрагменте, который можно упростить следующим образом:
# Must use aux. variable to access the script-level $args inside
# the Where-Object script block.
$id = $args[$i]
$memory = Get-Process | Where-Object { $_.id -eq $id } |
Select-Object -ExpandProperty VirtualMemorySize64
Обратите внимание на отсутствие лишних (...)
и $(...)
и удаление кавычек вокруг "$id"
, учитывая, что .Id
Свойством объекта процесса является число (тип [int]
).
Сделав шаг назад, я предлагаю объявить параметры в вашем скрипте, что предпочтительнее использования $args
- переменные, содержащие значения таких параметров, могут без проблем использоваться в Where-Object
блоках скрипта.
Обычно:
Это имеет смысл только получить доступ к $args
внутри блока скрипта, который вы Вызывается с аргументами , что не имеет место в блоке сценария, переданном в Where-Object
, где входные данные в блок сценария поступают (только) из конвейера , через automati c $_
переменную
В отличие от этого, вы можете передавать аргументы в блок скрипта, если Вы вызываете его с помощью &
, оператора вызова , например: & { "[$args]" } 'foo'
приводит к [foo]
.