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
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>
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%
You can use tee-object.
This will display the returned value in host console.
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.
powershell "&{.\test.ps1 %* ;exit $LastExitCode}" set code=%errorlevel%