I am trying to run a batch file from powershell. I would like to get the response but it is failing. If I run the .bat file:
rabbitmqctl.bat -n rabbit@xxx-123 ping
I get the following response:
Ping succeeded
However when I run it through powershell:
$test = Start-Process -FilePath "C:\Program Files\RabbitMQ\rabbitmq_server-3.10.7\sbin\rabbitmqctl.bat" -WindowStyle Hidden -ArgumentList "-n rabbit@xxx-123 ping" -Wait -PassThru;
$test variable is empty.
Any help?
To synchronously execute console applications or batch files in the current console window, call them directly.
$LASTEXITCODEvariable.Do not use
Start-Process(or theSystem.Diagnostics.ProcessAPI it is based on), except if truly necessary.Specifically, you can not directly capture the output from an executable launched from a
Start-Processcall; the only in-memory output you can capture - assuming you use the-PassThruswitch - is aSystem.Diagnostics.Processinstance describing the launched process.GitHub docs issue #6239 provides guidance on when use of
Start-Processis and isn't appropriate.Therefore:
Note:
Generally, you can call executables and batch files with arguments as you would from
cmd.exe, though there are some PowerShell-specific requirements:Because your specific batch-file path requires quoting, use of
&, the call operator, is needed (you may choose to always use it, but it is only necessary for commands (executable paths) that are quoted and/or contain variable references.For executables / batch files located in the current directory, a notable difference between
cmd.exeand PowerShell is that the latter - by security-minded design - requires your to explicitly signal the intent to invoke the file there, using prefix.\(or./); e.g. whilecmd.exeallows you to userabbitmqctl.batto invoke a batch file by that name in the current directory, PowerShell requires.\rabbitmqctl.batPowerShell's variable references, string literals and escaping rules differ from
cmd.exe:PowerShell supports two kinds of quoted string literals, expandable (double-quoted) strings (
"...") and verbatim (single-quoted) strings ('...')PowerShell's escape character is
`, the so-called backtick, wherecmd.exeuses^Variable references in PowerShell use sigil
$and distinguish between PowerShell-only and environment variables (e.g,$fooand$env:USERPROFILE), compared tocmd.exe, which knows only environment variables and uses%...%syntax (e.g.%USERPROFILE%)Compared to
cmd.exe, PowerShell has different and more metacharacters (characters with special meaning), notably$ @ { } , ; ( ) `. These enable many advanced features.