Для запуска сценария 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 - по уважительным причинам: изменение среды запущенного процесса произвольным (дочерним) процессомбудет серьезной проблемой безопасности.