2010-07-21 4 views
0

J'essaye de tuer toutes les instances d'un processus appelé "AetherBS.exe" mais le VBscript suivant ne fonctionne pas. Je ne suis pas exactement sûr où/pourquoi cela échoue.Processus de destruction dans Vbscript

Alors, comment puis-je tuer tous les processus de "AetherBS.exe?"

CloseAPP "AetherBS.exe" 

Function CloseAPP(Appname) 
    strComputer = "." 
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
    Set colItems = objWMIService.ExecQuery(_ 
     "SELECT * FROM Win32_Process", , 48) 
    For Each objItem In colItems 
     If InStr(1,Ucase(objItem.Name),Appname) >= 1 Then 
      objItem.Terminate 
     End If 
    Next 
End Function 
+0

Avez-vous une erreur? Si oui, quelle erreur et sur quelle ligne? Aussi, quel système d'exploitation utilisez-vous? – Helen

+0

Aucune erreur et Windows Server 2003. –

Répondre

3

Le problème est dans la ligne suivante:

If InStr(1,Ucase(objItem.Name),Appname) >= 1 Then 

Il Si vous convertissez la valeur de la propriété Win32_Process.Name en majuscule, mais ne convertissez pas le Appname en majuscule. Par défaut, InStr effectue une recherche sensible à la casse, donc si les chaînes d'entrée sont les mêmes mais diffèrent dans le cas, vous n'obtiendrez pas une correspondance.

Pour résoudre le problème, vous pouvez convertir Appname en majuscules ainsi:

If InStr(1, UCase(objItem.Name), UCase(Appname)) >= 1 Then 

ou vous pouvez utiliser le paramètre vbTextCompare d'ignorer le cas de la lettre:

If InStr(1, objItem.Name, Appname, vbTextCompare) >= 1 Then 


Cependant, il y a réellement pas besoin de ce contrôle du tout que vous pouvez l'incorporer directement dans votre requête:

Set colItems = objWMIService.ExecQuery(_ 
    "SELECT * FROM Win32_Process WHERE Name='" & Appname & "'", , 48) 
8

Voici la fonction de tuer le processus:

Sub KillProc(myProcess) 
'Authors: Denis St-Pierre and Rob van der Woude 
'Purpose: Kills a process and waits until it is truly dead 

    Dim blnRunning, colProcesses, objProcess 
    blnRunning = False 

    Set colProcesses = GetObject(_ 
         "winmgmts:{impersonationLevel=impersonate}" _ 
         ).ExecQuery("Select * From Win32_Process", , 48) 
    For Each objProcess in colProcesses 
     If LCase(myProcess) = LCase(objProcess.Name) Then 
      ' Confirm that the process was actually running 
      blnRunning = True 
      ' Get exact case for the actual process name 
      myProcess = objProcess.Name 
      ' Kill all instances of the process 
      objProcess.Terminate() 
     End If 
    Next 

    If blnRunning Then 
     ' Wait and make sure the process is terminated. 
     ' Routine written by Denis St-Pierre. 
     Do Until Not blnRunning 
      Set colProcesses = GetObject(_ 
           "winmgmts:{impersonationLevel=impersonate}" _ 
           ).ExecQuery("Select * From Win32_Process Where Name = '" _ 
          & myProcess & "'") 
      WScript.Sleep 100 'Wait for 100 MilliSeconds 
      If colProcesses.Count = 0 Then 'If no more processes are running, exit loop 
       blnRunning = False 
      End If 
     Loop 
     ' Display a message 
     WScript.Echo myProcess & " was terminated" 
    Else 
     WScript.Echo "Process """ & myProcess & """ not found" 
    End If 
End Sub 

Utilisation:

KillProc "AetherBS.exe" 
+0

Qui a réussi à tuer le processus. Y at-il un moyen de terminer le processus sans avoir la boîte de message Windows Script Host invite? J'essaye d'automatiser un test et l'invite stoppe effectivement le script. –

+0

@iobrien: Supprimez simplement où il est dit 'WScript.Echo'. – Sarfraz

-1

Essayez ci-dessous avec un script batch

wmic path win32_process Where "Caption Like '%%AetherBS.exe%%'" Call Terminate 

de la ligne cmd utilisez

wmic path win32_process Where "Caption Like '%AetherBS.exe%'" Call Terminate 
Questions connexes