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

Как я могу вернуть несколько значений из сценария powershell в пакетный файл, который его вызывает?

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

удалось вернуть только одно значение

код powershell (pstest.ps1):

 $p1=11
 $p2=22
 $p3=33
 exit

Пакетный файл:

 powershell .\pstest.ps1
 :: now I'd like to get those 3 returned values 
 :: into 3 individual variables so that I can do something like this:
 @echo First is %p1%, Second is %p2%, Third is %p3%

Итак, он должен отобразить это:

 First is 11, Second is 22, Third is 33

Ответы [ 4 ]

1 голос
/ 13 июня 2019

Точно так же вы получаете несколько значений из любого приложения: по одному в строке ...

@echo off
setlocal EnableDelayedExpansion

set "i=0"
for /F "delims=" %%a in ('powershell "$p1=11; $p2=22; $p3=33; $p1; $p2; $p3"') do (
   set /A i+=1
   set "p!i!=%%a"
)

echo First is %p1%, Second is %p2%, Third is %p3%

Я предлагаю вам прочитать этот ответ о массивах ...

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

В скрипте PowerShell я бы создал временный файл с результатами.В пакетном файле после вызова скрипта PowerShell я бы проанализировал этот временный файл с FOR / F, чтобы получить результаты и установить переменные среды в соответствии с требованиями.

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

Для более гибкого решения, использующего отложенное расширение, которое не требует, чтобы скрипт PowerShell выводил все значения в одной строке, и работало с переменным числом выходов, см. полезный ответ Аасини .


Предполагая, что количество значений фиксировано и известно заранее:

  • Сделать вывод сценария PowerShell одной строкой , содержащей все значения с известным разделителем .

  • В пакетном файле используйте for /f "delims=... tokens=..." для захвата значений в дискретных переменных цикла, которые вы можете назначить обычным переменным.

Упрощенный пример, который использует команду PowerShell для создания однострочного вывода с 3 значениями, разделенными | (чтобы применить это к вашему сценарию, используйте -File с вашим файлом *.ps1 вместо -c ( -Command) с командной строкой):

@echo off

for /f "delims=| tokens=1,2,3" %%a in ('powershell -c " '11|22|33' "') do set "p1=%%a" & set "p2=%%b" & set "p3=%%c"

:: echo the values of the newly created variables
echo p1: [%p1%]
echo p2: [%p2%]
echo p3: [%p3%]

Вышеуказанные выходы:

p1: [11]
p2: [22]
p3: [33]
0 голосов
/ 13 июня 2019

Помимо использования переменных окружения, вы можете попробовать что-то вроде этого на основе ответа SachaDee здесь :

PS:

function get-multiplereturnvalues {
  "11"
  "22"
  "33"
}
get-multiplereturnvalues

ПАРТИИ / CMD

@echo First is %p1%, Second is %p2%, Third is %p3%
for /f "delims=" %%a in ('powershell .\multi.ps1') do @echo "$Value=%%a"

Какие выходы:

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