I am trying to install an exe created using inno script. When I try to install it using PowerShell with
Start-Process -wait C:\updatefile.exe /VERYSILENT
all folders are created at proper places, registry values are created, but console hangs and does not reuturn unless Ctrl C is pressed.
But if I install exe using Command Prompt with
start /wait C:\updatefile.exe /VERYSILENT
everything goes properly and command prompt returns.
What could be cause of this anomaly?
I need this exe to install through Dockerfile, but as powershell install is hanging, container does not install exe. Even with CMD version in dockerfile, container does not create install folders.
///// After checking logs I found that exe service is being started by installer in end, if that is reason for hanging, can by some argument I can come out of powershell
CodePudding user response:
The -Wait switch of PowerShell's Start-Process cmdlet also waits for child processes of the launched process to exit[1], whereas cmd.exe's internal start command does not.
- As you note in a later comment, a service executable is launched by your installer at the end; given that services run indefinitely,
Start-Processalso waiting for that (child) process to terminate indeed explains the hang.
Here is a simple workaround:
cmd /c C:\updatefile.exe /VERYSILENT
When an executable is called via cmd /c, cmd.exe implicitly waits until the executable's process - and only it - terminates, even if it is a GUI application, just like start /wait would.
Given the behavior described in footnote [1], another workaround is to use the -PassThru switch with Start-Process (instead of -Wait) and pipe the result to Wait-Process:
Start-Process -PassThru C:\updatefile.exe /VERYSILENT | Wait-Process
[1] See GitHub issue #15555, which also discusses that Wait-Process acts differently in that only waits for the process itself to terminate.
As zett42 points out, the behavior of Start-Process -Wait is now at least briefly mentioned in the docs as well (emphasis added): "waits for the specified process and its descendants".
CodePudding user response:
try
$arguments = "/Verysilent" Start-Process -wait C:\updatefile.exe -ArgumentList $arguments
