2017-05-14 2 views
1

Ich versuche, ein VB-Skript, das ein anderes VB-Skript neu starten, wenn es abstürzt. Ich habe gesucht und gesucht, aber alles, was ich bekomme, ist, wie man ein Programm neu startet und da ein vb-Skript ein Hintergrundprozess ist, funktioniert es nicht, wenn Sie in Win32_Process suchen.Starten Sie ein VBS-Skript, wenn es abstürzt

Hier ist mein Code

set Service = GetObject ("winmgmts:") 
set Shell = WScript.CreateObject("WScript.Shell") 

sEXEName = "Test_To_Block.vbs" 

while true 
bRunning = false 

for each Process in Service.InstancesOf ("Win32_Process") 
    if Process.Name = sEXEName then 
    bRunning=true 
    msgbox("I am active") 
    End If 
next 


if bRunning=False then 
msgbox("I am not active.") 
Shell.Run sEXEName 
end if 


WScript.Sleep(100) 

wend 

Das Problem ist, dass es nie die Datei laufen zu sehen ist und öffnet nur Hunderte von „Test_To_Stop.vbs“ 's, die in mir löst den Computer neu starten zu müssen.

Meiner Meinung nach, was sollte geändert werden, wo der Code sucht.

for each Process in Service.InstancesOf ("Win32_Process") 

Anstatt sich in „Win32_Process“ müssen Sie überall dort, wo Hintergrundprozess laufen schauen.

Ich bin neu in der Codierung so tut mir leid, wenn dies eine einfache Frage ist.

Vielen Dank im Voraus.

Grüße,

A Viper

+1

Sie können [ 'WshShell' object] (https://www.google.ru/search?q=WshScriptExec)' .Exec ("wscript.exe" "C: \ Test \ Test_To_Block.vbs" "" -Methode, um das zu verfolgende Skript auszuführen, gibt diese Methode das Objekt "WshScriptExec" zurück und prüft, ob es sich um die Eigenschaft ".Status" handelt Der Prozess wird beendet und neu gestartet. Sie können sogar alle Funktionen innerhalb einer Skriptdatei kombinieren, die sich selbst starten würde. – omegastripes

+0

@omega Ich mag deine Idee, alles in einen Code zu schreiben, aber wie wird es den Prozess noch verfolgen, wenn der Code einen Fehler hat, endet der Code nicht einfach? –

+0

@omega Vielen Dank im Voraus! –

Antwort

1

Der Code unten startet sich neu über WshShell.Exec() Verfahren und Spurenzustand des laufenden Skript über .Status Eigenschaft zurückgegebene Objekt:

If Not WScript.Arguments.Named.Exists("task") Then 
    Do 
     With CreateObject("WScript.Shell").Exec("""" & WScript.FullName & """ """ & WScript.ScriptFullName & """ ""/task""") 
      Do While .Status = 0 
       WScript.Sleep 1 
      Loop 
     End With 
    Loop 
End If 

MsgBox "This script will be restarted immediately after termination" 

Eine andere Möglichkeit ist die .Run() Methode mit dem dritten Parameter set auf True zu wa es bis gestarteten Prozess beendet:

If Not WScript.Arguments.Named.Exists("task") Then 
    Do 
     CreateObject("WScript.Shell").Run """" & WScript.FullName & """ """ & WScript.ScriptFullName & """ ""/task""", 1, True 
    Loop 
End If 

MsgBox "This script will be restarted immediately after termination" 

Oder sogar simplier:

If Not WScript.Arguments.Named.Exists("task") Then 
    Do 
     CreateObject("WScript.Shell").Run """" & WScript.ScriptFullName & """ ""/task""", 1, True 
    Loop 
End If 

MsgBox "This script will be restarted immediately after termination" 
+0

Ich habe versucht, es zu benutzen und es nur schwört meine CPU, vielleicht sieht es das Programm nicht? So heißt es, wenn ich ein ".vbs" "Microsoft® Windows Based Script" starte. –

+0

Der Code funktioniert gut für mich, möglicherweise gibt es einige Probleme mit WSH auf Ihrem PC? Versuchen Sie, die .vbs-Datei auszuführen, die die einzige Zeile mit 'MsgBox' enthält. – omegastripes

+0

Ja, die msgbox funktioniert einwandfrei. Aber über die WSH, welche Fenster verwendest du? Ich habe ein Windows 10. –

0

Wahrscheinlich, weil der Name des laufenden Prozesses 'wscript.exe' und nicht 'Test_To_Block.vbs' ist. Unter Umständen können Sie den Hack auf this Seite erwähnt verwenden, um den Namen des Prozesses zu ändern:

Wenn Sie die Skripte lokal laufen lassen und einige regelmäßige Skripte, ein gemeinsamen Hack läuft nur wscript zu kopieren und umbenennen. exe zu einem bestimmten Namen, wie "MyScript1.exe". Führen Sie dann das Skript mit einer Verknüpfung wie "... \ MyScript1.exe MyScript1.vbs" aus. Dann wird der Prozess als MyScript1.exe angezeigt.

Dann können Sie sEXEName = "MyScript1.exe"

verwenden Hinweis: anstelle der Verwendung Shell.run sExeName Verwendung Shell.run "Test_To_Block.vbs"

+0

Der Name meines Codes lautet "Microsoft ® Windows Based Script" und wenn ich nur nach wscript.exe suche, wird es sich wahrscheinlich nur sehen. Ich habe Ihr "Umbenennungssystem" ausprobiert, aber es hat nicht funktioniert. Danke im Voraus! –

Verwandte Themen