Переменная среды Powershell - PullRequest
1 голос
/ 09 июня 2019

В скрипте Powershell (.ps1) Запускается из командной строки консоли (cmd.exe)

Как установить и переменную окружения в консоли,
чтобы когда сценарий Powershell заканчивал обработку,
и выходит на консоль, где был вызван ...
переменная окружения существует,
и может быть прочитан командным файлом,
или просматривается командой SET?

не хотите устанавливать переменную 'Machine' или 'User' ...
только переменная консольного процесса ...
та же самая переменная, которую вы получаете, если вы используете SET в консоли

1 Ответ

3 голосов
/ 09 июня 2019

Для запуска сценария PowerShell из cmd.exe всегда требуется (powershell.exe / pwsh.exe) дочерний процесс , а дочерние процессы принципиально не могут установить переменные средыдля их родителя процесса [1] .

Лучше всего сделать так, чтобы имел *.ps1 файл выход имя и значение требуемой переменной среды, а затем вызывающий процесс cmd.exe создает ее на основе этого вывода.

Примечание по безопасности :Слепое определение переменных среды на основе пар имя-значение, выводимых другой командой (в вашем случае сценарием *.ps1), должно выполняться только в том случае, если вы доверяете этой команде, чтобы не выводить вредоносные определения.

Вот простой пример (запускается непосредственно из интерактивного cmd.exe сеанса):

for /f "delims== tokens=1,*" %v in ('powershell.exe -c "'FOO=bar'"') do @set "%v=%w"

Вышеуказанная переменная среды %FOO% имеет значение bar, основанное накоманда PowerShell, выводящая буквенную пару имя-значение FOO=bar.Проверьте с помощью echo %FOO%.

Чтобы расширить этот подход до , определяя несколько переменных среды , команда выводит каждое определение в отдельной строке (что в PowerShell можнодостичь путем вывода массива строк):

for /f "delims== tokens=1,*" %v in ('powershell.exe -c "'FOO=bar', 'BAZ=bam'"') do @set "%v=%w"

Выше дополнительно определяется %BAZ% со значением bam.


Чтобы сделать это болееудобно, Я предлагаю создать пакетный файл оболочки (*.cmd), который выполняет вышеуказанное :

  • Обратите внимание, что вам придетсяиспользуйте %%v и %%w вместо %v и %w там.

  • Вместо -c (для -Command) с командой demo, используйте -File путь к файлу *.ps1 для его вызова.

    • Также рассмотрите возможность использования -NoProfile, чтобы обойти загрузку файла $PROFILE вашей среды PowerShell, что не только замедляет работувниз, но может загрязнить вывод вашей команды.

[1] As LotPings pКак видно, дочерние процессы наследуют копии переменных окружения родительского процесса.Модификации этих копий никогда не видны родителю.Дочерний процесс принципиально не может изменить свою среду родителя , что является ограничением на уровне OS - по уважительным причинам: изменение среды запущенного процесса произвольным (дочерним) процессомбудет серьезной проблемой безопасности.

...