Как показано в вашем собственном ответе , PSv3 + использует специальную $using:
область - которая позволяет включать значения переменных из области действия вызывающего в блоки сценариев, выполненные удаленно - решает вашу проблему .См. Нижний раздел, если вам нужно решить проблему в PowerShell v2.
Что касается , почему ваш оригинальный подход, основанный на -ArgumentList
, не работал :
В то время как блок сценария, переданный Invoke-Command
, видит все, что было передано через -ArgumentList
в его немедленном объеме, любые команды в нем, которые запускают черезблок сценария ({ ... }
) - даже если они технически работают в той же области , как в случае с Where-Object
и ForEach-Object
- do not см. тот же массив $Args
, если только он явно не передан - то есть not опция с блоками сценария, передаваемыми в такие командлеты, как Where-Object
и ForEach-Object
.
Упрощенный пример (в котором даже не используется удаленное взаимодействие, что является следствием исходной проблемы):
Invoke-Command {
# OK - sees 'foo', because $Args reflects what was passed via -ArgumentList
"0: $($Args[0])"
# !! Does NOT see foo', because the script block executed by ForEach-Object
# !! - even though it runs in the same scope - has its own $Args definition
# !! and given that NO arguments were passed to *it*, the $Args that it
# !! sees is *empty* (an empty array).
'bar' | ForEach-Object { "1: $($Args[0])" }
} -ArgumentList 'foo'
Выше приведено:
0: foo
1:
, который показывает, что блок скрипта, переданный в ForEach-Object
, больше не видит то же значение $Args
, что и область верхнего уровня блока скрипта, переданного to Invoke-Command
.
Вы можете заставить свой оригинальный подход работать следующим образом (что необходимо, если вы застряли в PowerShell v2):
Invoke-Command {
# OK - sees 'foo', because $Args reflects what was passed via -ArgumentList
"0: $($Args[0])"
# Save the original $Args array...
$ArgsSaved = $Args
# ... and reference the *saved* array in the script block.
'bar' | ForEach-Object { "1: $($ArgsSaved[0])" }
} -ArgumentList 'foo'