Почему не работает аргумент командной строки, когда он помещается непосредственно в команду в скрипте? - PullRequest
2 голосов
/ 05 апреля 2020

Мне трудно понять, почему использование $ args [$ i] непосредственно в этой команде не работает. Это дает совершенно неправильный ответ.

$memory=$(Get-Process | Where-Object {$_.id -eq "$($args[$i])"}  | select -expand VirtualMemorySize64)

Тем не менее, помещение аргумента командной строки в другую переменную и его использование работает.

$id=($args[$i])
$memory=$(Get-Process | Where-Object {$_.id -eq "$id"}  | select -expand VirtualMemorySize64)

Объяснение того, почему это было бы здорово .

1 Ответ

3 голосов
/ 05 апреля 2020

Каждый блок сценария ({ ... }) в 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].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...