передать переменные в подпроцесс в PowerShell

Можно ли запустить все переменные env в новое окно PowerShell следующим образом:

$var=10; Start-Process powershell '-command "echo $var; Start-Sleep -s 5; "'

Это ничего не показывает в дочернем окне.

Если невозможно получить все переменные, как передать некоторые из них?

Эта переменная (var) отличается от переменной env?

1 ответ

Переменная - это не то же самое, что переменная среды. В PowerShell доступ к переменным среды осуществляется с помощью $ENV. Например, $ENV: COMPUTERNAME или $ENV: logonserver.

бывший. Запуск процесса Powershell "ECHO $ ​​ENV:COMPUTERNAME;Pause"

Поскольку эти значения извлекаются из ОС при вызове, они всегда доступны и не зависят от вашей среды PowerShell.

Переменная $var - это переменная области сеанса, которая действительна только в текущем процессе PS. В вашем случае на экран ничего не выводится, потому что переменная не существует в новом процессе PowerShell.

Самый простой способ получить работающий пример, который вы предоставили, - это переработать кавычки, чтобы позволить PowerShell заменять переменную в строке. Это в основном передает процессу буквальное значение, а не просит его оценить переменную, о которой он ничего не знает.

Попробуйте это: Start-Process PowerShell "-command Echo $var; start-sleep -s 5" В подпроцесс передается следующее: -command echo 10; start-sleep -s 5$var подставляется перед вызовом для запуска процесса.

Если ваша цель - определить переменные в другом процессе, лучше всего использовать блоки сценария. Все, что есть в блоке сценария, выполняется удаленным процессом. Можно определять переменные, функции, все, что вы можете делать локально, вы можете делать в дочернем процессе. Блок сценария определяет код, который будет выполняться в другом процессе, и может называться как угодно. В приведенном ниже примере я намеренно избегал называть его $ScriptBlock, чтобы продемонстрировать это. Типичное соглашение об именах - просто называть переменную $ScriptBlock.

Пример: я собираюсь отказаться от ECHO и использовать Write-Host. Любой из них будет работать в этом примере. Кроме того, позволяет передать параметр -NoExit, чтобы окно оставалось открытым, а не в спящем режиме. Чтобы передать несколько параметров в PowerShell, мы будем использовать параметр -ArgumentList.

$ScriptBlockExample = {$var = 10; Write-Host "Это мое значение" $var;}
Start-Process PowerShell -ArgumentList "-NoExit $scriptBlockExample"

Это откроет новое окно PS и выполнит содержимое блока скрипта. После завершения команды введите $var в новом окне, и вы получите обратно значение 10. Это потому, что переменная была определена в новом процессе.

Уловка состоит в том, чтобы понять, что по умолчанию два процесса не взаимодействуют друг с другом. Если бы у вас была определена переменная $var в окне родительского процесса, она была бы полностью независимой от переменной $var во втором процессе. Есть способы заставить их поговорить, но это кое-что на другой день.

Другие вопросы по тегам