2009-05-07 3 views
2

Ich habe eine VBScript-App geschrieben, um Word- und Excel-Dokumente zu öffnen und Textblöcke und verschiedene Abschnitte zu suchen und zu ersetzen, wobei der neue Text aus einer einfachen Textdatei extrahiert wird. Ich habe absichtlich jede Fehlerprüfung vermieden, vor allem, weil ich es zu der Zeit nicht herausfinden konnte (und das Skript lief trotzdem zuverlässig). Jetzt, Monate später, auf meinem lokalen Rechner, erhalte ich unerklärlicherweise Fehlermeldungen über Normal.dot, das geändert wird, und ein Meldungsfeld, in dem ich gefragt werde, was ich dagegen tun möchte (was drei weitere Dialoge erfordert, um endlich zu antworten). Natürlich tötet dies meine Fähigkeit, das Skript auszuführen und einfach wegzugehen, da es das Skript zum Scheitern bringt. Wenn das passiert, muss ich den Task-Manager öffnen, Winword.exe finden (von dem die GUI nicht ausgeführt wird) und es beenden und dann mein Skript erneut ausführen.Wie schließe ich Word (oder andere App), wenn ein Fehler in einem VBScript auftritt?

Was ist eine sinnvolle Möglichkeit, den Fehler abzufangen und Word (oder Excel) erfolgreich herunterzufahren. Auf der Grundlage dieser question versuche ich dies:

Set objDoc = objWord.Documents.Open(curDir1 + "\docs\template_spec.dot") 

If Err.Number <> 0 Then 
WScript.Echo "Error in Word Open:" & Err.Description 
objWord.Quit 
Else 
Set objSelection = objWord.Selection 

'Do replacement activities' 
ReplaceText(objSelection) 

objDoc.SaveAs(curDir1 + "\docs\mynewdocument.doc") 
objWord.Quit 
End If 

Set objShell = Nothing 
Set objWord = Nothing 
Set objExcel = Nothing 

Natürlich, wie das Schicksal es wollte, ich das Problem nicht replizieren kann, so funktioniert es wie normal. Scheint diese Lösung vernünftig? Und eine Nebenfrage: Wie zum Teufel bringe ich Word dazu, aufzuhören, sich über Normal.dot zu beschweren (oder das Skript dazu zu bringen)? Es ist, als ob sich Word im Hintergrund offen lässt, nachdem ich in einigen Fällen die GUI geschlossen habe.

Antwort

0

Ich habe Angst, dass

WScript.Echo "..." 

wenn es jemals feuert, wird das Skript zum Stillstand kommen. Ansonsten sieht alles gut aus. Ich werde damit spielen, wenn ich nach Hause komme.

Edit: Word hängt ziemlich häufig im Hintergrund. Wenn Sie beispielsweise Outlook verwenden und Word als Outlook-Editor verwenden, wird Word erst wieder gelöscht, wenn Outlook nicht mehr verfügbar ist.

2

haben Sie in Betracht gezogen, alles in eine 'On Error Resume Next'-Anweisung zu verpacken, damit Ihr Skript alle Fehler ignoriert und so lange wie möglich vor dem Aufruf von objWord.quit weiterläuft, unabhängig vom Erfolg oder Fehlschlag.

, wenn Sie mehr Informationen über die korrekte Verwendung von ‚On Error Resume Next‘, dann gehen zu the msdn article on it!

hoffe, das hilft!

Paul

+0

ist dies eine Standardmethode, um dies zu tun, ich habe ein längliches Skript, das von einem Excel-Arbeitsmappe funktioniert. Jeder Fehler im Skript, der es ausbombiert und das Arbeitsbuch offen lässt. Können Sie Fehlerdaten mehrfach verschachtelt haben? – DevilWAH

+0

habe diesen Link tatsächlich angeschaut Ich tyhink ich bekomme es jetzt :) Prost – DevilWAH

0

ich bei der Verwendung von "On Error Resume Next" würde zustimmen.

Wenn Sie Word wirklich zwangsweise beenden müssen, können Sie WMI und die Win32_Process-Klasse verwenden, um den Prozess zu finden und zu beenden. Dies sollte der letzte Ausweg sein, wenn alles andere fehlschlägt.

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 

Set colProcess = objWMIService.ExecQuery("Select * from Win32_Process Where Name = 'winword.exe'") 
For Each objProcess in colProcess 
    objProcess.Terminate() 
Next 

Dies war ein modifiziertes Beispiel von: http://www.computerperformance.co.uk/vbscript/wmi_process_stop.htm

Also, stellen Sie sicher, dass alle Verweise auf das Objekt Word-Automatisierung geschlossen sind und/oder auf nichts festlegen, bevor Sie den Prozess beenden.

0

Die zuverlässigste Methode zum Beenden aller ActiveX-Instanzen, Bereinigen von Unrat und Freigeben von Ressourcen besteht darin, den Code für diesen Zweck in Sub Class_Terminate() einer Dummy-Klasse zu speichern. Erstellte Instanz der Klasse kann Skript-Quit-Ereignis verarbeiten.

Option Explicit 
Dim objBeforeQuitHandler, objWord 

' create a dummy class instance 
Set objBeforeQuitHandler = New clsBeforeQuitHandler 

' create word app instance 
Set objWord = CreateObject("Word.Application") 
objWord.Visible = True 
objWord.Documents.Add.ActiveWindow.Selection.TypeText "80040000 error was raised. About to terminate the script." & vbCrLf & "Word will be quitted without saving before script termination just you close popped up error message." 

' your code here... 

' raise an error 
Err.Raise vbObjectError 

Class clsBeforeQuitHandler 
    ' dummy class for wrapping script quit event handler 
    Private Sub Class_Terminate() 
     Dim objDoc 
     On Error Resume Next ' to prevent errors in case of unexpected word app termination 
     If TypeName(objWord) <> "Object" Then ' word app has not been closed yet 
      objWord.DisplayAlerts = False 
      For Each objDoc In objWord.Documents 
       objDoc.Saved = True ' to prevent save as dialog popping up 
       objDoc.Close 
      Next 
      objWord.Quit 
     End If 
    End Sub 
End Class 
+0

Siehe auch: http://Stackoverflow.com/a/21206112/603855, http://Stackoverflow.com/a/20382898/603855 –

Verwandte Themen