Newsgroup: it.comp.lang.visual-basic
Titolo: VBS  come sapere se un programma è terminato

Scrivo per sapere se è possibile migliorare uno script che mi dovrebbe dire se
un programma è terminato per aggiungere l'info dell'uso in un log.
Il programma di seguito funziona ma si deve ciclare tutti i processi e mi
consuma della Cpu, forse esiste qualche altro metodo migliore che ignoro.
__________________
Do
 WScript.Sleep 2000
 ProcN=""
  For Each oProcess in GetObject("winmgmts:").InstancesOf("win32_process") 
    If LCase(oProcess.name) = "acrobat.exe" Then
      ProcN = oProcess.name 
     Exit For
    End If
  Next 
   If Len(ProcN) = 0 Then		'finito?
     If fso.FileExists(Win_ini) Then	
       MsgBox Prg_ini & " End"
   ' qui scrittura log
   End If
    Exit Do
  End If
Loop
__________
--
ciao
  Stefano

__________
Naturalmente bisogna aggiungere prima:
Set fso = CreateObject("Scripting.FileSystemObject") 
Set oShell = CreateObject("WScript.Shell")
e  Win_ini  è il file di Log.
--
ciao
  Stefano


Prova con
If GetObject("winmgmts:").ExecQuery("SELECT * FROM win32_process WHERE
name='acrobat.exe'").Count = 0 Then
    '... finito
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.

   For Each oProcess in GetObject("winmgmts:").InstancesOf("win32_process")
MAI adoperato e comunque MAI gradito il WMI prova cosi >> plain WSH (.vbs)):
(bisogna vedere se sta soluzione a te va bene
Const ForReading = 1, ForWriting = 2, ForAppending = 8
set oShell = CreateObject("WScript.Shell")
Set oFSO = CreateObject("Scripting.FileSystemObject")
sLogFile = "C:\Win_ini.log"
Set oLogFile = oFSO.OpenTextFile(sLogFile, 8, True, 0)
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("calc")
Do While oExec.Status = 0
     WScript.Sleep 100
Loop
'WScript.Echo "stato " & oExec.Status &"     "  &"programma chiuso"
oLogFile.WriteLine "stato "&oExec.Status&" "&"programma chiuso " & now()
 WScript.Sleep 2000
Set oExec = WshShell.Exec("notepad")
 WScript.Sleep 2000
oExec.Terminate()
--
Fosco

 (bisogna vedere se sta soluzione a te va bene)
oppure se NON vuoi fare partire tu ma semplicemente
tenere sotto controllo un processo ecco una cosa che NON ciuccia
la cpu ed e' MILLE volte meglio del WMI :
;   
http://www.hiddensoft.com/autoit3/
; test.au3
While ProcessExists("notepad.exe")
 Sleep("10")
wend
 MsgBox(0, "", "Notepad is NOT running")
;
ProcessExists
--------------------------------------------------------------------------------
Checks to see if a specified process exists.
ProcessExists ( "process" )
Parameters
process The name or PID of the process to check.
Return Value
Success: Returns the PID of the process.
Failure: Returns 0 if process does not exist.
Remarks
Process names are executables without the full path, e.g., "notepad.exe" or "winword.exe"
--
Fosco

;   
http://www.hiddensoft.com/autoit3/
Grazie mille, non conoscevo Autoit.
Adesso lo provo.
--
ciao
  Stefano

 Adesso lo provo.
Un portento .. fa TUTTO quello che potresti fare in VB6
questa e' la beta e supporta com chiamate dirette API/DLL [1]
http://www.autoitscript.com/autoit3/files/beta/autoit/
[1]
DllCall("Shell32.dll", "int", "ShellExecute", "hwnd", 0, "str", 'open', "str", _
"c:\windows\calc.exe", "str", '', "str", @WorkingDir, "int", 10)
sleep(500)
DllCall("Shell32.dll", "int", "ShellExecute", "hwnd", 0, "str", 'open', _
"str","c:\windows\notepad.exe", "str", '', "str", @WorkingDir, "int", 10)
$r = DllCall('kernel32','long','GetTickCount')
MsgBox(4096,'Time','Windows started ' & $r[0] & ' ms ago.')
Sleep(500)
$hwnd  = DllCall("user32.dll","long","FindWindow","str","Notepad", _
"str","Senza nome - Blocco note")
$hwndCalc = DllCall("user32.dll","long","FindWindow","str","SciCalc","str","Calcolatrice")
;MsgBox(262144, "",@error )
MsgBox(262144, "","Notepad hwnd  " & $hwnd[0])
MsgBox(262144, "", "Calc hwnd  "&$hwndCalc[0])
 $goal = DLLCall("user32.dll","long","SetForegroundWindow","hwnd",$hwnd[0])
--
Fosco

 Un portento .. fa TUTTO quello che potresti fare in VB6
fosco, tu sei la quinta colonna di iclvb. vbs o altro, purche' non sia vb6 
:))
ciao, a.