How to get a returned value from powershell and get it in a batch file?

前端 未结 5 837
我在风中等你
我在风中等你 2021-02-06 10:19

I\'m trying to execute a powershell from a batch file with the commande: Powershell .\\nameoffile.ps1

The PowerShell returns some values 1, 4, 0 and -1 . How can I get t

相关标签:
5条回答
  • 2021-02-06 10:29

    What about something like this?

    test.bat

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

    It just redirects the output of the powershell script to a text file and then outputs the contents of the text file to the console.

    Here is my test.ps1 file

    Write-Output "Hello World"
    Exit
    

    And here is the output:

    C:\temp\batchtest>test.bat

    Hello World

    C:\temp\batchtest>

    0 讨论(0)
  • 2021-02-06 10:31

    If you need to use this value in your bat environment use FOR /F :

    @echo off
    for /f "delims=" %%a in ('powershell .\test.ps1') do Set "$Value=%%a"
    
    Echo Value received from Powershell : %$Value%
    
    0 讨论(0)
  • 2021-02-06 10:38

    You can use tee-object.

    This will display the returned value in host console.

    0 讨论(0)
  • 2021-02-06 10:43

    I know it's a little bit late to answer this question, but I would like to give it a try just in case any one needs more detailed solution. So, here it goes.

    I created a batch function that would execute ps script for you and return a value, something like this:

    :: 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
    

    Now, as an example to use it:

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

    This will display on console screen You got it

    As a more complicated example, I would add:

    Let's assume that we want to check if a VM is Up or Down, meaning if it's powered on or off, so we can do the following:

     :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
    

    Now, how to use :CheckMachineUpOrDown function?

    just follow this example:

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

    This will display Up if the VM is Powered On or Down if the machine is Off.

    0 讨论(0)
  • 2021-02-06 10:46
    powershell "&{.\test.ps1 %* ;exit $LastExitCode}" set code=%errorlevel%
    
    0 讨论(0)
提交回复
热议问题