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

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

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

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

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

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


person Vishwanath    schedule 14.04.2021    source источник
comment
Отвечает ли это на ваш вопрос? Powershell Start-Process для запуска сеанса Powershell и передачи локальные переменные   -  person Scepticalist    schedule 14.04.2021
comment
определение переменной и переменной env отличается? поможет ли это в этом случае, если мы определим переменные как переменные среды?   -  person Vishwanath    schedule 14.04.2021
comment
Также, пожалуйста, расскажите, как мы можем передавать переменные в текущем синтаксисе с использованием -command вместо ArgumentList.   -  person Vishwanath    schedule 14.04.2021
comment
@Theo я создаю подпроцесс следующим образом: ``` Powershell Start-Process '-command $Host.UI.RawUI.WindowTitle = ''title''; эхо вар; Старт-Сон -с 5; ```   -  person Vishwanath    schedule 14.04.2021


Ответы (1)


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

бывший. Пуск-Процесс Powershell ECHO $ENV:COMPUTERNAME;Пауза

Поскольку эти значения извлекаются из ОС при вызове, они всегда доступны и не зависят от вашей среды 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 во втором процессе. Есть способы заставить их говорить, но об этом в другой раз.

person Ernest Correale    schedule 15.04.2021