Avatar billede oomalkeoo Nybegynder
25. marts 2010 - 08:38 Der er 10 kommentarer og
1 løsning

Loop der tjekker om program køre?

Hejsa eksperter,

Jeg mangler et .vbs script der tjekker om 'minfil.exe' køre, så snart minfil.exe bliver lukket så skal scriptet kører en batfil.

Jeg tror det jeg skal have fat i er et script der hvert sekund kigger om minfil.exe stadig kører, og når denne process er helt død opstartes den batfil.

Har selv prøvet på noget, men det går helt den forkerte vej!

Option Explicit
Dim objWMIService, objProcess, colProcess
Dim strComputer, strList

strComputer = "."

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

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process where name = 'minfil.exe'")

For Each objProcess in colProcess
strList = strList & vbCr & _
objProcess.Name
Next

If strList='miranda32.exe' Then alert("minfil.exe is open!")

WScript.Quit

' End of List Process Example VBScript


;-----------------------------------------
Er der nogle der kan hjælpe med dette problem?
Avatar billede tjp Mester
25. marts 2010 - 11:02 #1
Hvad med noget a la:

Dim notFound
While True
    notFound = true
    For Each Process In GetObject("winmgmts:").InstancesOf("win32_process")
        If StrComp(Left(Process.Name, 10), "minfil.exe", 1) = 0 Then
            notFound = false
        End If
    Next
    If notFound Then
        Set WshShellObj = WScript.CreateObject("WScript.Shell")
        WshShellObj.Run ("calc.exe" )
    End If
    WScript.Sleep 2000
Wend
Avatar billede oomalkeoo Nybegynder
25. marts 2010 - 11:51 #2
Har lige prøvet det, men synes jeg får en hulens masse calc's - Det kører bare i ring :(
Avatar billede tjp Mester
25. marts 2010 - 12:19 #3
Sorry, det var jo 'minfil.exe' der sku startes.. Ny version:

Dim Found
While True
    Found = false
    For Each Process In GetObject("winmgmts:").InstancesOf("win32_process")
        If StrComp(Left(Process.Name, 10), "calc.exe", 1) = 0 Then
            Found = True
        End If
    Next
    If not Found Then
        Set WshShellObj = WScript.CreateObject("WScript.Shell")
        WshShellObj.Run ("calc.exe" )
    End If
    WScript.Sleep 2000
Wend
Avatar billede tjp Mester
25. marts 2010 - 12:20 #4
Prøver lige igen, tsk tsk:

Dim Found
While True
    Found = false
    For Each Process In GetObject("winmgmts:").InstancesOf("win32_process")
        If StrComp(Left(Process.Name, 10), "minfil.exe", 1) = 0 Then
            Found = True
        End If
    Next
    If not Found Then
        Set WshShellObj = WScript.CreateObject("WScript.Shell")
        WshShellObj.Run ("minfil.exe" )
    End If
    WScript.Sleep 2000
Wend
Avatar billede oomalkeoo Nybegynder
25. marts 2010 - 14:28 #5
Lige til at starte med, hvordan stopper man et vbs script igen ;)

- Kan være jeg har fået det hele lidt forkert ud. Det der skal ske er at jeg starter min vbs fil som så kigger een gang i sekundet efter om en process er lukket, er den ikke lukket så venter den stadig videre. Første gang den finder ud af at processen er lukket stopper vbs filen og en andet program starter.
Avatar billede tjp Mester
25. marts 2010 - 14:47 #6
Afslut VBS script:
Tryk Ctrl + Alt + Delete
Klik 'Task Manager' (Jobliste)
Find og marker 'wscript.exe' i listen på fanen 'Processes' (Processer)
Tryk 'End Process' (Afslut proces) og 'Yes' (Ja) til advarsel

Det andet kræver bare lidt flytten rundt på ovenstående kode og et hop ud af while-løkken med en 'Exit While'. :-)
Avatar billede oomalkeoo Nybegynder
25. marts 2010 - 14:55 #7
Perfekt!

Er dette helt ulovligt? :)


Dim Found
While True
    Found = false
    For Each Process In GetObject("winmgmts:").InstancesOf("win32_process")
        If StrComp(Left(Process.Name, 10), "calc.exe", 1) = 0 Then
            Found = True
        End If
    Next
    If not Found Then
        Set WshShellObj = WScript.CreateObject("WScript.Shell")
        WshShellObj.Run ("notepad" )
    WScript.Quit
    End If
    WScript.Sleep 2000
Wend

Husk at lave et svar.
Avatar billede oomalkeoo Nybegynder
25. marts 2010 - 15:10 #8
Har dog et halvt problem, har dette:

Dim Found
While True
    Found = false
    For Each Process In GetObject("winmgmts:").InstancesOf("win32_process")
        If StrComp(Left(Process.Name, 10), "miranda32.exe", 1) = 0 Then
            Found = True
        End If
    Next
    If not Found Then
        Set WshShellObj = WScript.CreateObject("WScript.Shell")
        WshShellObj.Run ("hello.bat" )
    WScript.Quit
    End If
    WScript.Sleep 2000
Wend

men alligevel kommer hello.bat op med det samme, selvom miranda32.exe kører, har du en ide? Prøvede med calc.exe og der virker det fint. hmm
Avatar billede tjp Mester
25. marts 2010 - 15:44 #9
Prøv at ændre:
If StrComp(Left(Process.Name, 10), "miranda32.exe", 1) = 0 Then

til:
If StrComp(Left(Process.Name, 13), "miranda32.exe", 1) = 0 Then


Ellers tjek at "miranda32.exe" dukker op når du kører:

for each Process in GetObject ("winmgmts:").InstancesOf("Win32_Process")
  WScript.Echo Process.Name
next
Avatar billede oomalkeoo Nybegynder
25. marts 2010 - 15:56 #10
Første løsning hjalp, helt perfekt!

- Jeg vil gerne sige mange tak for hjælpen, det var været helt perfekt!
Avatar billede tjp Mester
25. marts 2010 - 16:02 #11
You're welcome... :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester