Sushwanth
Sushwanth

Reputation: 625

Find exit code for executing a cmd command through PowerShell

I am using a silent installation command to install software. I am running this command from PowerShell 3.0.

$silentInstall = C:\Users\Admin\Documents\Setup-2.0.exe exe /s /v"EULAACCEPTED=\"Yes\" /l*v c:\install.log /qn"

Invoke-Expression $silentInstall

This runs the command which installs the software, but it does not wait for it to complete and goes ahead with the next lines of code. I want to have control over the installation so that I would know if it's completed or not.

How do I get an error code for the Invoke-Expression cmdlet so that I can get to know if the cmd executed successfully or not?

Upvotes: 8

Views: 30597

Answers (3)

Andy Arismendi
Andy Arismendi

Reputation: 52689

It depends on how the EXE file runs - sometimes it will kick off a separate process and return immediately, and in such cases this usually works -

$p = Start-Process -FilePath <path> -ArgumentList <args> -Wait -NoNewWindow -PassThru
$p.ExitCode

Otherwise this usually works -

& <path> <args>
$LASTEXITCODE

Or sometimes this -

& cmd.exe /c <path> <args>
$LASTEXITCODE

Upvotes: 24

Bill_Stewart
Bill_Stewart

Reputation: 24585

You shouldn't need to use Invoke-Expression:

& C:\Users\Admin\Documents\Setup-2.0.exe /s /vEULAACCEPTED=Yes /l*v C:\install.log /qn

Upvotes: 3

Aaron Jensen
Aaron Jensen

Reputation: 26799

It looks like you're running an MSI installer. When running from the console, control is immediately returned while MSI forks a new process to run the installer. There is no way to change this behavior.

What you'll probably need to do is use Get-Process to find a process named msiexec, and wait for it to finish. There is always an msiexec process running, which handles starting new installers, so you'll need to find the msiexec process that started after your install began.

$msiexecd = Get-Process -Name 'msiexec'
C:\Users\Admin\Documents\Setup-2.0.exe exe `
                                       /s `
                                       /v"EULAACCEPTED=\"Yes\" /l*v c:\install.log /qn"
$myMsi = Get-Process -Name 'msiexec' | 
             Where-Object { $_.Id -ne $msiexecd.Id }
$myMsi.WaitForExit()
Write-Verbose $myMsi.ExitCode

Upvotes: 3

Related Questions