Расширение строк не работает в PowerShell при использовании Invoke-Command на удаленном компьютере. - PullRequest
5 голосов
/ 27 января 2011

Почему первый пример не эквивалентен второму?

1:

$volumeNum = 2
Invoke-Command -ComputerName $IP -Credential $GuestVM -ScriptBlock {"select volume $volumeNum" | diskpart}

2:

Invoke-Command -ComputerName $IP -Credential $GuestVM -ScriptBlock {"select volume 2" | diskpart}

Почему PowerShell не оценивает

"выберите объем $ volumeNum"

до

выбор громкости 2

Ответы [ 3 ]

7 голосов
/ 27 января 2011

Блок сценария, который выполняется с помощью Invoke-Command, не имеет доступа к текущему состоянию среды, он запускается в отдельном процессе. Если вы выполняете команду на локальном компьютере, она будет работать.

Проблема в том, что строка "select volume $volumeNum" не проверяется, пока не будет выполнена на удаленном компьютере. Поэтому он ищет значение в среде текущего процесса на удаленной машине, и $volumeNum там не определено.

PowerShell предоставляет механизм для передачи аргументов через Invoke-Command. Это работает с моей локальной машины на удаленный:

Invoke-Command -ComputerName $ip -ScriptBlock { param($x) "hello $x" } -ArgumentList "world"

Я считаю, что подобный подход будет работать для вас:

Invoke-Command -ComputerName $IP -Credential $GuestVM -ScriptBlock {param($volumeNum) "select volume $volumeNum" | diskpart} -ArgumentList $volumeNum
3 голосов
/ 27 января 2011

Блоки скриптов скомпилированы. Это означает, что ссылки на переменные в них фиксируются во время компиляции. Вы можете обойти это, отложив создание блока скрипта до времени выполнения:

$sb = [scriptblock]::create("select volume $volumeNum | diskpart")
Invoke-Command -ComputerName $IP -Credential $GuestVM -ScriptBlock $sb
2 голосов
/ 27 января 2011

Дальнейшее примечание для других: GetNewClosure тоже не работает.

$filt = "*c*"
$cl = { gci D:\testdir $filt }.GetNewClosure()
& $cl

# returns 9 items
Invoke-command -computer mylocalhost -script $cl
# returns 9 items
Invoke-command -computer mylocalhost -script { gci D:\prgs\tools\Console2 $filt }
# returns 4 items
Invoke-command -computer mylocalhost -script { gci D:\prgs\tools\Console2 "*c*" }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...