Mastering the PowerShell Start-Process Cmdlet: Best PowerShell 101

Mastering the PowerShell Start-Process Cmdlet: Best PowerShell 101

In this article, we will dive into the Start-Process cmdlet and explore its various capabilities and features. The Start-Process cmdlet provides the flexibility and control you need. Join us as we teach you how to handle process parameters, manage input and output streams, and leverage its advanced options for script automation.

Streams of the Start-Process

When using the Start-Process cmdlet in PowerShell, it’s important to understand the different streams associated with the process. Streams are channels through which data flows between the process and the PowerShell environment. Start-Process provides access to four primary streams:

  1. Standard Input (stdin): This stream allows you to provide input to the process. You can use the -RedirectStandardInput parameter to redirect input from a file or the pipeline to the process.
  2. Standard Output (stdout): This stream contains the standard output of the process, which includes the regular program output or any information written to the console. By default, this output is displayed in the PowerShell console, but you can redirect it to a file or capture it in a variable using the -RedirectStandardOutput parameter.
  3. Standard Error (stderr): This stream contains the error output of the process. It includes error messages, warnings, or any other output related to errors. By default, this output is also displayed in the PowerShell console, but you can redirect it to a file or capture it in a variable using the -RedirectStandardError parameter.
  4. Information Stream (verbose, debug, warning, verbose): This stream provides additional information about the execution of the process. It includes verbose messages, debug information, warning messages, and progress information. By default, this output is displayed in the PowerShell console, but you can redirect it to a file or capture it in a variable using the appropriate -RedirectStandardX parameter (e.g., -RedirectStandardError for warnings).

To redirect any of these streams to a file, you can use the -RedirectStandardX parameter followed by the path to the file. For example, to redirect standard output to a file:

Start-Process -FilePath "command.exe" -RedirectStandardOutput "output.txt"
Streams of the Start-Process

To capture the output in a variable, you can use the -NoNewWindow parameter along with the -Wait parameter to wait for the process to complete before capturing the output. For example:

$output = Start-Process -FilePath “command.exe” -NoNewWindow -Wait -RedirectStandardOutput $true -PassThru

The $output variable will contain the output of the process.

Exit Codes for Start-Process

When using the Start-Process cmdlet in PowerShell, you can check the exit code of the process to determine the success or failure of the executed command. The exit code is a numeric value that the process returns upon completion, indicating its status. 

By checking the exit code of a process started with Start-Process, you can incorporate error handling and decision-making logic based on the success or failure of the executed command.

To access the exit code of a process started with Start-Process, you can use the $LASTEXITCODE variable. This variable holds the exit code of the most recently executed command or process. After running Start-Process, you can check the value of $LASTEXITCODE to determine the exit code.

Here’s an example:

Exit Codes for Start-Process

In the example above, we execute a command using Start-Process and wait for it to complete. Then, we check the value of $LASTEXITCODE. If the exit code is 0, we assume the process was completed successfully. Otherwise, we consider it a failure and display the exit code.

Taking Streams and Exit Codes

When working with external processes in PowerShell, you may need to capture their output streams and handle exit codes. PowerShell provides mechanisms to capture and process both the standard output (stdout) and standard error (stderr) streams, as well as retrieve the exit code of the executed process.

To capture the output streams of a process, you can use the redirection operators > and 2> in conjunction with the Start-Process cmdlet. Here’s an example:

$stdoutFile = "output.txt"
$stderrFile = "error.txt"

Start-Process -FilePath "command.exe" -NoNewWindow -RedirectStandardOutput $stdoutFile -RedirectStandardError $stderrFile -Wait

# Read the captured output and error files
$stdout = Get-Content $stdoutFile
$stderr = Get-Content $stderrFile

Process the output and error as needed
Write-Host "Standard Output:"
Write-Host $stdout
Write-Host "Standard Error:"
Write-Host $stderr
Taking Streams and Exit Codes

In the example above, we redirect the standard output to a file named output.txt and the standard error to a file named error.txt. After the process completes using the -Wait parameter, we read the content of these files using Get-Content and store them in variables ($stdout and $stderr). You can then process the captured output and error as needed, such as displaying them on the console or analyzing them further.

To retrieve the exit code of the executed process, you can use the $LASTEXITCODE variable. After running Start-Process, you can check the value of $LASTEXITCODE to determine the exit code. Here’s an example:

Start-Process -FilePath “command.exe” -NoNewWindow -Wait

if ($LASTEXITCODE -eq 0) {
    Write-Host "Process completed successfully."
} else {
    Write-Host "Process failed with exit code: $LASTEXITCODE."
}
Taking Streams and Exit Codes

In this example, we check the value of $LASTEXITCODE after running the process. If the exit code is 0, we assume the process was completed successfully. Otherwise, we consider it a failure and display the exit code.

Disadvantages of the Start-Process Cmdlet

While the Start-Process cmdlet in PowerShell is a powerful tool for launching and managing external processes, it does have a few limitations and potential disadvantages to be aware of:

  1. By default, Start-Process launches a new process and waits for it to complete before proceeding. 
  2. When using Start-Process, the standard output and standard error streams of the executed process are not displayed in real-time on the console. 
  3. Start-Process doesn’t provide direct access to detailed process information such as process ID (PID), parent process ID (PPID), or process handle. 
  4. While PowerShell is cross-platform and available on multiple operating systems, the behavior and capabilities of Start-Process may vary across different platforms. 
  5. Start-Process relies on external executables or commands to run. 

Despite these limitations, Start-Process remains a valuable tool in PowerShell for launching and managing external processes. It offers flexibility and control over process execution and can be combined with other PowerShell features to create more complex automation tasks. Happy Browsing!

Meet the Author

Abdul Rahim has been working in Information Technology for over two decades. Learn how Abdul got his start as a Tech Blogger , and why he decided to start this Software blog. If you want to send Abdul a quick message, then visit his contact page here.