In linea di principio NESSUNO se non per il waitOnReturn che rende SINCRONA la chiamata, quindi se il comando dovesse richiedere 3minuti, l'uscita dalla chiamata avviene dopo 3 minuti, normalmente invece l'uscita è immediata e non sai se viene eseguita.
Devi però leggere le istruzioni di quello che usi.
Ad esempio se assegni la call a RUN ad una variabile puoi capire se è stato rilevato un errore o meno…
errorCode = wsh.Run("myScript.cmd", windowStyle, waitOnReturn)
If errorCode = 0 Then
MsgBox "Execution successful. No error to report."
Else
MsgBox "Program exited with error code " & errorCode & "."
End If
Quindi usando WScript, intanto sei SINCRONO e poi l'uscita è determinabile…
Per farlo con la SHELL avresti dovuto usare le API OpenProcess, metterti in loop ed attendere GetExitCodeProcess.
Per lasciare aperta la finestra hai provato a passare il parametro
/S Modifies the treatment of string after /C or /K (see below)
/C Carries out the command specified by string and then terminates
/K Carries out the command specified by string but remains
wsh.Run "cmd.exe /S /C....