如何从powershell获取返回值并将其放入批处理文件中?

时间:2015-12-24 10:37:23

标签: powershell batch-file

我尝试使用commande从批处理文件执行powershell: Powershell。\ nameoffile.ps1

powershell返回一些值1,4,0​​和-1。如何从批次中获取这些值?当我使用%errorlevel%时,它只返回0(这意味着脚本没问题)。我也尝试在powershell中使用Exit命令(退出4),但它不起作用。 你能救我吗?

此致

修改 如果有人有兴趣,我找到了解决方案。谢谢你的时间

  

powershell"& {。\ test.ps1%*;退出$ LastExitCode}"组   代码=%ERRORLEVEL%

5 个答案:

答案 0 :(得分:8)

如果您需要在蝙蝠环境中使用此值,请使用FOR /F

@echo off
for /f "delims=" %%a in ('powershell .\test.ps1') do Set "$Value=%%a"

Echo Value received from Powershell : %$Value%

答案 1 :(得分:2)

powershell "&{.\test.ps1 %* ;exit $LastExitCode}" set code=%errorlevel%

答案 2 :(得分:0)

这样的事情怎么样?

<强> test.bat的

@echo off
powershell .\test.ps1 >output.log
type output.log

它只是将powershell脚本的输出重定向到文本文件,然后将文本文件的内容输出到控制台。

这是我的 test.ps1 文件

Write-Output "Hello World"
Exit

这是输出:

  

C:\ temp \ batchtest&gt; test.bat

     

Hello World

     

C:\ TEMP \ batchtest&GT;

答案 3 :(得分:0)

如何使用tee-object这将在主机控制台中显示返回的值

答案 4 :(得分:0)

我知道回答这个问题有点晚了,但我想尝试一下,以防任何人需要更详细的解决方案。所以,就在这里。

我创建了一个批处理函数,它将为您执行ps脚本并返回一个值,如下所示:

function formatCurrency(number) {
    return (number != null && number != "") ? "$".concat(parseFloat(number).toFixed(2).toString()
        .split('').reverse().join("")
            .replace(/\d\d\d(?!$)/g, "$&,")
                .split('').reverse().join("")) : number;
}

现在,作为使用它的一个例子:

:: 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>
  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函数?

按照这个例子:

 :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>
  for /F "usebackq tokens=1" %%i in (`Powershell %1`) do set returnValue=%%i
  set "%2=%returnValue%"
  Goto:eof
:: End of :RunPS function

如果机器处于关机​​状态,则会显示虚拟机是否处于开启或关闭状态。