Переменная — это не то же самое, что переменная среды. В 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