-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Description
Related: #5152
Using Start-Process to invoke console (terminal) programs is (almost always) inappropriate, but, unfortunately, very common - instead, such programs should be invoked by direct invocation / via &, the call operator.
Proper guidance at the start of the Start-Process topic would go a long way to help clear up the confusion:
Note: Start-Process launches the new process asynchronously by default; add -Wait to wait for the newly created process to terminate.
-
DO NOT use
Start-Processif you want to run a console (terminal-based) program synchronously, in the same window, with its standard streams connected to PowerShell's streams and the exit code reflected in$LASTEXITCODE- just invoke such a program directly / via&
(e.g.whoami.exeor& whoami.exerather thanStart-Process whoami.exe).-
Even if you use
Start-Process -NoNewWindow -Wait, you won't be able to capture or redirect the program's output (you can only save stdout and stderr (separately) to files, as text, via-RedirectStandardOutand-RedirectStandardError). Additionally, the process' exit code will not be reflected in$LASTEXITCODEwhen you useStart-Process. -
However, if your use case really calls for
Start-Process(see below) and you need to obtain the process exit code, you can add-PassThruto theStart-Processcall, which returns a process-information object (System.Diagnostics.Process) whose.ExitCodeproperty can be examined after the newly launched process has exited, which you can ensure by also passing-WaittoStart-Process, or by calling.WaitForExit()on the object later, or by checking if.HasExitedindicates$true.
-
-
[Only needed on Unix] DO use
Start-Processto launch a GUI program asynchronously on Unix-like platforms (e.g.,Start-Proces gedit).- Note: On Windows, GUI programs launch asynchronously even with direct invocation /
&, soStart-Process NotepadandNotepadhave the same effect.
- Note: On Windows, GUI programs launch asynchronously even with direct invocation /
-
[Only needed on Unix] DO use
Start-Processto launch a detached process via the standardnohuputility, i.e. a process that will run invisibly, detached from the calling terminal, sending its output to a file.- Note: On Windows, you can achieve a similar effect by launching with
-WindowStyle Hidden(albeit without automatic saving of output in a file).
- Note: On Windows, you can achieve a similar effect by launching with
-
[Windows-only] DO use
Start-Processfor starting console applications in a new window.-
On Unix-like platforms,
-NoNewWindowis invariably implied, and use ofStart-Processfor console programs there only makes sense if either (a) they neither prompt for input nor produce output or (b)-Waitis also used - but then direct invocation /&is the better choice - see The Start-Process topic contains incorrect and misleading information about use on Unix-like platforms #3013 -
[Windows-only] With
-WindowStyle <style>you can additionally control the new process' window style (both for console windows and the windows of GUI applications, though they latter may not respect the setting), such as whether to start the window maximized, minimized, or even hidden (see next point).
-
-
[Windows-only] DO use
Start-Process -WindowStyle Hidden, if you want to launch a process hidden. -
[Windows-only] DO use
Start-Processwith-Verb RunAsin order to launch a process elevated (with administrative privileges, with triggers a UAC security prompt), invariably in a new window.- Caveat:
-Verb RunAscannot be combined with the-RedirectStandard*parameters, so if you want to capture the elevated process' output in files, you'll need to launch a shell process with a command line that uses that shell's redirection features from inside the elevated process, along the lines ofStart-Process -Verb RunAs cmd.exe '/c "net session > out.txt"'
- Caveat:
-
[Windows-only] DO use
Start-Processwith-Credentialif you want to launch a process with a different user identity, invariably in a new window.- Caveat: This can not be combined with
-Verb RunAs, so in order to run as a different user and with elevation,Start-Processcalls must be nested, as demonstrated in this Stack Overflow answer.
- Caveat: This can not be combined with
From a cross-platform perspective, the short of it is:
- On Unix-like platforms,
Start-Processis useless except for two (unusual) scenarios: launching a GUI application asynchronously and launching a detached process vianohup
Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.
- ID: fa4b8de4-3ea1-4210-4562-b084b0a51c0d
- Version Independent ID: ab184c39-041b-588c-acde-f715f6d3aee2
- Content: Start-Process (Microsoft.PowerShell.Management)
- Content Source: reference/7.0/Microsoft.PowerShell.Management/Start-Process.md
- Product: powershell
- GitHub Login: @daxian-dbw
- Microsoft Alias: dongbow