Как я могу вызвать скрипт powershell из командного файла и вернуть несколько значений в командный файл? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть командный файл, и я хочу вызвать скрипт powershell, который возвращает несколько значений в командный файл.

Я пытался сделать это, устанавливая переменные окружения, но это не работает.

Это командный файл:

::C:\temp\TestPScall.bat
@echo off
powershell -executionpolicy Bypass -file "c:\temp\PStest.ps1"
@echo [%psreturncode%]
@echo [%uservar%]
@echo [%processvar%]

Это скрипт powershell:

# c:\temp\PStest.ps1
$env:psreturncode = "9990"
[Environment]::SetEnvironmentVariable("UserVar", "Test value.", "User")
[Environment]::SetEnvironmentVariable("ProcessVar", "Test value.", "Process")

Когда я запускаю его, переменные окружения не заполняются.

Как мне заставить это работать?

Ответы [ 3 ]

0 голосов
/ 04 июня 2019

Давайте поговорим о том, почему это не работает.

CMD загружает свои переменные окружения в начале приложения.

Поэтому, когда вы обновляете переменные окружения в Powershell, затем пытаетесь вызвать их из того же сценария, он не может найти их, потому что они не были загружены в CMD.

Если вы перезапустите CMD, эти переменные среды будут существовать.

Существуют приложения, которые обходят это и устанавливают переменные среды в CMD без перезапуска.

А.С. Мервальд заявил, что вы можете использовать refreshenv, но это не встроенная команда в Windows. Это происходит от Шоколад. Ссылка ниже:

Шоколадный RefreshEnv.cmd является популярным.

0 голосов
/ 04 июня 2019

Есть ли у PowerShell вызов cmd или bat-файла?

C:\users\js> powershell $env:a = 'there'; cmd
Microsoft Windows [Version 10.0.16299.1150]
(c) 2017 Microsoft Corporation. All rights reserved.

C:\users\js> echo %a%
there
0 голосов
/ 04 июня 2019

Как указано в комментарии выше, переменные среды меняются за сеанс.Итак, вы должны запустить новый экземпляр cmd после запуска сценария PS.В качестве альтернативы вы также можете попытаться вызвать refreshenv из cmd, но я не уверен, что это сработает, поскольку в документе указано, что он перезагрузит значения из реестра.

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

С о переменных среды :

Чтобы внести постоянные изменения в переменную среды, используйте «Система» на панели управления (вкладка «Дополнительно» или элемент «Дополнительные параметры системы»), чтобы сохранить изменения в реестре.

При изменении переменных среды в PowerShellизменение влияет только на текущий сеанс.Это поведение напоминает поведение команды Set в средах на базе Windows и команды Setenv в средах на основе UNIX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...