我有调用另一个 .exe 文件的 powershell 脚本。
Start-Process ".\file.exe" -wait
file.exe 是一个带有一些消息的简单窗口,并且只有一个按钮可以关闭 .exe。
这是主脚本运行的第一行。我想等待并让用户单击关闭以继续执行其余代码。
然而,进程启动了,但主程序没有等待,而是开始执行其余的代码。
还有什么我需要做的吗?
我有调用另一个 .exe 文件的 powershell 脚本。
Start-Process ".\file.exe" -wait
file.exe 是一个带有一些消息的简单窗口,并且只有一个按钮可以关闭 .exe。
这是主脚本运行的第一行。我想等待并让用户单击关闭以继续执行其余代码。
然而,进程启动了,但主程序没有等待,而是开始执行其余的代码。
还有什么我需要做的吗?
这个建议可能不是最好的方法,但在开始一个过程时就想到了。诀窍是让脚本知道另一个进程正在运行,并且必须传达另一个进程已经完成。一种方法是让 EXE 通过在文件关闭之前写入文件进行通信,脚本不断读取文件,等待 EXE 输入的特定输出。虽然这很脏,所以另一种方法是在 Powershell 中使用 Windows 窗体并在 PowerShell 而不是 EXE 中调用窗体(如果需要,我可以详细说明)。我的第三个解决方案可能是最容易实现的,但不是最干净的。在启动 EXE 之前,获取所有进程并将它们存储在一个数组中。然后我会启动 EXE 并再次获取进程,但这一次寻找不在该数组中的进程。这很可能是您的 EXE,您可以让脚本在一个while循环中查找并等待该进程停止。例子:
$processes = (Get-Process).Id
Start-Process ".\file.exe"
Start-Sleep -Seconds 1
$exeProc = (Get-Process).Id | ?{$processes -notcontains $_}
$running = (Get-Process | ?{$_.Id -match $exeProc}).Id
while($running){
Start-Sleep -Seconds 1
$running = (Get-Process | ?{$_.Id -match $exeProc}).Id
}
不确定这是否是您要查找的内容,但是您可以使用 NSI 包装器来运行第一个脚本 ExecWait "powershell -File .\file.exe"
,并且应该可以完成这项工作。
之后运行任何其他脚本,它将执行您要查找的操作。
Start-Process 似乎为该进程创建了一个新窗口,即使您指定了 -Wait 开关。
以前对我有用的是向 Start-Process 添加 -NoNewWindow 开关
尝试
Start-Process ".\file.exe" -NoNewWindow -Wait