Вызов PowerShell из пакета и извлечение нового значения временной переменной среды, заданной в сценарии? - PullRequest
8 голосов
/ 05 августа 2010

Надеюсь, название краткое, но на всякий случай:

Я вызываю скрипт PowerShell из командного файла. Я хочу, чтобы сценарий PowerShell устанавливал значение переменной среды и чтобы это новое значение было доступно в пакетном файле после завершения сценария PowerShell.

Я знаю, что можно установить переменную среды с помощью $ env в PowerShell, но это значение не сохраняется после завершения сценария PowerShell. Я предполагаю, что это, вероятно, потому что PowerShell выполняется в отдельном процессе.

Мне известно, что я могу вернуть код завершения и использовать% ErrorLevel%, но это даст только цифры, и возникнет конфликт, поскольку 1 указывает на исключение PowerShell, а не на полезное число.

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

Возможно ли это?

Заранее спасибо:)

Ник

Ответы [ 3 ]

10 голосов
/ 05 августа 2010

Чтобы понять идею использования Китом stdout, вы можете вызвать powershell из своего пакетного сценария следующим образом:

FOR /F "usebackq delims=" %v IN (`powershell -noprofile "& { get-date }"`) DO set "d=%v"

Немного неловко, но это работает:

C:\>FOR /F "usebackq delims=" %v IN (`powershell -noprofile "& { get-date }"`) DO set "d=%v"
C:\>set d
d=August 5, 2010 11:04:36 AM
0 голосов
/ 27 апреля 2017

Я знаю, что уже немного поздно ответить на этот вопрос, но я хотел бы попробовать его на тот случай, если кому-то понадобится более подробное решение. Итак, вот и все.

Я создал пакетную функцию, которая будет выполнять скрипт ps для вас и возвращать значение, что-то вроде этого:

:: A function that would execute powershell script and return a value from it.
:: <PassPSCMD> pass the powreshell command, notice that you need to add any returning value witth Write-Host
:: <RetValue> the returned value
:RunPS <PassPSCMD> <RetValue>
  Powershell Set-ExecutionPolicy RemoteSigned -Force
  for /F "usebackq tokens=1" %%i in (`Powershell %1`) do set returnValue=%%i
  set "%2=%returnValue%"
Goto:eof
:: End of :RunPS function

Теперь, в качестве примера, чтобы использовать его:

set psCmd="&{ Write-Host 'You got it';}"
call :RunPS %psCmd% RetValue
echo %RetValue%

Это будет отображаться на экране консоли. Вы получили

В качестве более сложного примера я бы добавил:

Давайте предположим, что мы хотим проверить, включена ли виртуальная машина или нет, то есть, включена она или выключена, поэтому мы можем сделать следующее:

 :CheckMachineUpOrDown <returnResult> <passedMachineName>
   set userName=vCenterAdministratorAccount
   set passWord=vCenterAdminPW
   set vCenterName=vcenter.somedmain.whatever
   set psCmd="&{Add-PSSnapin VMware.VimAutomation.Core; Connect-VIServer -server %%vCenterName%% -User %userName% -Password %passWord%; $vmServer = Get-VM %2;Write-Host ($vmServer.PowerState -eq 'PoweredOn')}"

   call :RunPS %psCmd% RetValue
   if "%RetValue%" EQU "True" (set "%1=Up") else (set "%1=Down")
 Goto:eof

:: A function that would execute powershell script and return a value from it.
:: <PassPSCMD> pass the powreshell command, notice that you need to add any returning value witth Write-Host
:: <RetValue> the returned value
:RunPS <PassPSCMD> <RetValue>
  Powershell Set-ExecutionPolicy RemoteSigned -Force
  for /F "usebackq tokens=1" %%i in (`Powershell %1`) do set returnValue=%%i
  set "%2=%returnValue%"
  Goto:eof
:: End of :RunPS function

Теперь, как использовать: функцию CheckMachineUpOrDown?

просто следуйте этому примеру:

set Workstation=MyVMName
call :CheckMachineUpOrDown VMStatus %Workstation%
echo %VMStatus%

Отображается «Вверх», если виртуальная машина включена, или «Вниз», если машина выключена.

Надеюсь, это полезно.

Спасибо

0 голосов
/ 05 августа 2010

Самый простой способ получения результатов из PowerShell - это использование стандартного вывода в PowerShell.Например, это сохраняет дату в переменную dvv в cmd.exe

set d = powershell -noprofile "& { get-date }"
...