edvmaedchenfueralles
Goto Top

Datei mit VB-Skript beenden

Hallo zusammen!
Keine Ahnung ob ich hier richtig bin!
Ist es möglich mittels VB-Skript eine Datei zu beenden (ein Programm zu schließen)? Ist eine Access-Datenbank!

Wenn ja, wie sieht der code aus? Wshell. ???


Danke im voraus!

Content-Key: 75071

Url: https://administrator.de/contentid/75071

Printed on: April 16, 2024 at 11:04 o'clock

Mitglied: 48558
48558 Dec 03, 2007 at 14:33:01 (UTC)
Goto Top
Also ein Programm killst du mit VBScript + WMI.

Also so:

Prog = "notepad.exe"   'Hier Name des Prozess eingeben.  

Set wmi = GetObject("winmgmts:")   
Set System = wmi.instancesOf("win32_process")   
For Each process in system 
  if lcase(process.name) = LCase(Prog) then
    process.Terminate (0) 
  End If 
Next
Member: bastla
bastla Dec 03, 2007 at 14:59:10 (UTC)
Goto Top
Hallo edvmaedchenfueralles!

Da sind für mich einige Fragen offen:

  • Was verstehst Du unter "beenden"? Wenn damit gemeint ist, einen Task zu "killen", gleich die Zusatzfrage:
  • Ist es sinnvoll, eine Datenbank- (nennen wir Access mal so) Datei "gewaltsam" zu beenden? Wenn Du das tatsächlich willst:
  • Ist darauf zu achten, ob mehrere Instanzen von Access laufen? Wenn ja:
  • Wie sind diese zu unterscheiden? Um den Namen der ".mdb"-Datei auslesen zu können, müsste diese aus dem Dateisystem (Doppelklick im Explorer) oder per Commandline geöffnet worden sein. Alternativ wäre noch eine Reihung nach dem Startzeitpunkt der einzelnen Access-Instanzen möglich.

Für den einfachsten Fall, nämlich "beende über die Taskliste alle Access-Instanzen" würde der Code etwa so aussehen:
strProcName = "MSACCESS.EXE"  
strComputer = "."   
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")   
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process",,48)   
For Each objItem in colItems
	If UCase(objItem.Name) = strProcName Then objItem.Terminate
Next
Wenn der Name der ".mdb"-Datei in der Commandline aufscheint, dann so:
strProcCmd = "TEST.MDB"  
strComputer = "."   
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")   
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process",,48)   
For Each objItem in colItems
	If Instr(UCase(objItem.CommandLine), strProcCmd) > 0 Then objItem.Terminate
Next
In beiden Fällen bitte die durchgängige Großschreibung der Suchbegriffe beachten (oder auch dafür ein UCase() verwenden).

Grüße
bastla

[Edit] @48558: Als ich angefangen hab', stand Dein Kommentar noch nicht da - aber mein zwischenzeitliches Telefonat war anscheinend ganz schön lang ... [/Edit]
Member: edvmaedchenfueralles
edvmaedchenfueralles Dec 04, 2007 at 08:15:22 (UTC)
Goto Top
Danke für die schnellen Antworten!
Mir ist durchaus bewusst, dass es nicht die schönste Lösung ist den Access-Prozess zu killen! Allerdings ist mir sonst keine Möglichkeit bekannt, das Programm zu beenden und wieder zu starten!

Gibts etwas schonenderes?

Es müsste ja auch so gehen, dass ich das Access-Fenster aktiviere (den Fokus drauf setze->Wie?) und dann mittels Sendkeys die entsprechenden Tasten zum beenden schicke! Könnte das funktionieren? Wie aktiviere ich das Accessfenster falls es im Hintergrund liegt?


Bin für jeden Tipp dankbar!
Member: Biber
Biber Dec 04, 2007 at 08:27:55 (UTC)
Goto Top
Moin edvmaedchenfueralles,

schreib doch bitte noch mal zwei Zeilen zur Notwendigkeit dieser Aktion.
Eine Access-Applikation, die führer- bzw. user-los durchs Weltall treibt und per Skript beendet werden muss..?????

Neugierig
Biber
Member: edvmaedchenfueralles
edvmaedchenfueralles Dec 05, 2007 at 16:01:20 (UTC)
Goto Top
Danke für eure Hilfe!
Habs mit diesem Code gemacht:
Dim objWMIService, objProcess, colProcess
Dim strComputer, strProcessKill
strComputer = "."  
strProcessKill = "'msaccess.exe'"  

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

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill )  
For Each objProcess in colProcess
objProcess.Terminate()
Next