This recommendation is possibly not the best approach, but came to mind with starting a process. The trick is letting the script know that the other process is running, and it must be communicated that the other process has finished. One method is to have the EXE communicate by writing to a file right before it closes, the script is constantly reading the file waiting for a certain output entered by the EXE. This is dirty though, so another way is to use Windows Forms in Powershell and call the form in PowerShell instead of an EXE (I can elaborate if needed). My third solution is probably the easiest to implement, but not the cleanest. Before launching the EXE, get all processes and store them in an array. Then I would launch the EXE and get processes again, but this time looking for the one that is not in that array. This will likely be your EXE, which you can have the script then look for in a while loop and wait for that process to drop. Example:
$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
}