$command
- это блок скрипта ({ ... }
) и , преобразующий в строку блок скрипта, в результате его литерал содержимое ,исключая включающие {
и }
.
Следовательно, ваша расширяемая строка "-NoExit -Command $command 'C:\inetpub\wwwroot'"
буквально расширяется до следующей строки - обратите внимание на отсутствующий { ... }
вокруг исходного блока скрипта:
-NoExit -Command
param($dir)
Set-Location $dir
Write-Output $dir
'C:\inetpub\wwwroot'
Из-за потери включающих {
и }
новый процесс powershell
, порожденный Start-Process
, тихо игнорировал потерянный оператор param($dir)
и, учитывая, что новый процесс поэтому не имел $dir
переменная (учитывая, что она не является автоматической переменной), команда завершилась неудачно, поскольку Set-Location $dir
равносильно Set-Location $null
, что не удалось. [1]
Обратите внимание, что вы никогда не сможете передать блоки скриптов как таковые в Start-Process
- все аргументы должны быть строк , потому что только строки могут быть переданы внешние процессы .
Самое простое решение в вашем случае:
заключают ссылку $command
в расширяемую строку в { ... }
, чтобы компенсировать потерю этого корпуса из-за строкового кодирования
и prepend &
для обеспечения вызова результирующего блока скрипта в новом процессе.
Вот рабочийрешение:
Start-Process powershell -Verb RunAs -ArgumentList `
"-NoExit -Command & { $command } 'C:\inetpub\wwwroot'"
Важное замечание: Хотя это и не требуется для конкретного блока сценария под рукой, любой блок сценария, имеющий встроенных символов "
.не будет правильно обработан как часть общей строки "..."
целевым процессом ;чтобы предотвратить это, они должны быть экранированы как \"
, чего ожидают внешние программы, включая PowerShell через CLI:
# Script block with embedded " chars.
$command = {
param($dir)
Set-Location $dir
"Current dir: $dir"
}
# Embed the script block with " escaped as \"
Start-Process powershell -Verb RunAs -ArgumentList `
"-NoExit -Command & { $($command -replace '"', '\"') } 'C:\inetpub\wwwroot'"
[1]Сбой в Windows PowerShell ;в PowerShell Core это равносильно Set-Location
без аргументов , которое заменяет домашнюю папку текущего пользователя.