Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

VBS-Chiusura di un programma legata alla chiusura diun altro

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Triumph Of Steel, archimede

VBS-Chiusura di un programma legata alla chiusura diun altro

Postdi nerolubo85 » 10/11/09 01:27

Salve a tutti, ho una curiosità da togliermi...
Questo è lo script VBS da lanciare per eseguire FreePOPs in accoppiata al client di posta predefinito:

Codice: Seleziona tutto
Option Explicit

Function WriteFile(oFS,mailClientPath,mailProcessName)
  Dim oFSFile
  Set oFSFile = oFS.OpenTextFile(FileName,2,True)
  oFSFile.Write(100 & VbCrLf & MailClientPath &  VbCrLf & MailProcessName)
  oFSFile.Close
End Function

Function ReadFile(oFS,ByRef delay, ByRef mailClientPath,ByRef mailProcessName,ByRef mailClientCla)
  Dim oFile, oStream
  Set oFile = oFS.GetFile(fileName)
  Set oStream = oFile.OpenAsTextStream(1,-2)
  delay = CInt(oStream.ReadLine)
  mailClientPath = oStream.ReadLine
  mailProcessName = oStream.ReadLine
  If Not oStream.AtEndOfStream Then
    mailClientCla = oStream.ReadLine
  Else
    mailClientCla = VbCrLf
  End If
  oStream.Close
End Function

Function GetDefaultMailClientPath(sh)
  Dim key,temp,splitted
  key = "HKCR\mailto\shell\open\command\"
  temp = sh.RegRead (key)
  splitted = Split(temp,"""")
  'Debug Istr
  'wScript.echo "MailClientPath = " & Sh.RegRead (key)
  If UBound(splitted) > 0 Then 
    GetDefaultMailClientPath = splitted(1)
  Else
    splitted = Split(temp," ")
    GetDefaultMailClientPath = splitted(0)
    'wScript.echo "MailClientPath = " & splitted(0)
  End If
End Function

Function GetProcessName(mailClientPath)
  Dim arr
  arr = Split(mailClientPath, "\")
  GetProcessName = arr(UBound(arr))
End Function

Function GetIstances (nome,objWMIService)
  Dim colProcess
  Set colProcess = objWMIService.ExecQuery( "Select * from Win32_Process Where Name='" & nome & "'")
  Set GetIstances = colProcess
End Function

Function IsActive (nome,objWMIService)
  Dim objProcess
  For Each objProcess in GetIstances (nome,objWMIService)
     IsActive = True
     Exit Function
  Next
  IsActive = False
End Function

Function TerminateSingleIstance (nome,objWMIService)
  Dim colProcess,objProcess
  Set colProcess = GetIstances(nome, objWMIService)
  For Each objProcess in colProcess
     objProcess.Terminate
     Exit Function
  Next
End Function

'==Modification for a function which deletes the log files
Function DeleteLogs (oFS)
  If oFS.FileExists("log.txt") = True Then
    oFS.DeleteFile("log.txt")
  End If
  If oFS.FileExists("stderr.txt") = True Then
    oFS.DeleteFile("stderr.txt")
  End If
  If oFS.FileExists("stdout.txt") = True Then
    oFS.DeleteFile("stdout.txt")
  End If
End Function
'==End of modification

'==Modification for a function which retrieves FreePOP's path

Function GetFreePOPsPath(sh)
  Dim key,temp
  key = "HKLM\Software\NSIS_FreePOPs\Install_Dir"
  temp = sh.RegRead (key)
  GetFreePOPsPath = temp & "\"
End Function

'==End of modification

Const fileName = "fpm.ini"
Dim sh, objWMIService,active,delay,mailClientPath,mailProcessName,mailClientCla,cla,arg,i,oFs,FPUpdate
Set sh=wScript.CreateObject("wScript.Shell")
Set objWMIService = GetObject("winmgmts:")
Set cla = wScript.Arguments
Set oFS = CreateObject("Scripting.FileSystemObject")

If oFS.FileExists(fileName) = True Then
  ReadFile oFS,delay,mailClientPath,mailProcessName,mailClientCla
Else
  mailClientPath = GetDefaultMailClientPath(sh)
  mailProcessName = GetProcessName(mailClientPath)
  delay = 100
  mailClientCla = VbCrLf
  WriteFile oFS,mailClientPath,mailProcessName
End If

If IsActive(mailProcessName,objWMIService) = True Then
  wScript.Quit
End If
active = IsActive("freepopsd.exe",objWMIService)
If active = False Then
  arg = ""

  '==Modification to delete the log files prior to running FreePOPs
  For i=0 To cla.Count-1
     If Lcase(cla(i)) = "-clearlogs" Then
       DeleteLogs oFS
     Else
       If Lcase(cla(i)) = "-update" Then
         FPUpdate = True
       Else
         arg = arg & " " & cla(i)
       End If
     End If
  Next
  '==End of modification

  '==Modification to run updater prior to running FreePOPs
  If FPUpdate = True Then
    sh.Run """" & GetFreePOPsPath(sh) & "freepopsd.exe" & """ -e lua\updater.lua php interactive" & """",1,true
  End If
  '==End of modification

  sh.Run("freepopsd.exe" & arg)
  wScript.Sleep delay
End If
If mailClientCla = VbCrLf Then
  sh.Run """" & mailClientPath & """",1,true
Else
  sh.Run """" & mailClientPath & """ " & mailClientCla,1,true
End If
If active = False Then
  TerminateSingleIstance "freepopsd.exe",objWMIService
End If
wScript.Quit


I due programmi vengono caricati e fino a qui tutto mi è chiaro.
Ora quando io vado a chiudere il client di posta, mi accorgo che anche FreePOPs viene automaticamente terminato.
Qualcuno è in grado di spiegarmi come questo può accadere dato che quell'ultimo "active = False" è legato al processo di FreePOPs?
Mi serve perché vorrei creare uno script simile, ma non riesco ad ottenere lo stesso risultato.
Grazie
nerolubo85
Utente Senior
 
Post: 124
Iscritto il: 04/12/05 11:33

Sponsor
 

Re: VBS-Chiusura di un programma legata alla chiusura diun altro

Postdi Dylan666 » 12/11/09 11:21

Codice: Seleziona tutto
If active = False Then
  TerminateSingleIstance "freepopsd.exe",objWMIService
End If


La parte sopra è quella che controlla se il programma di posta è ancora attivo e in caso contrario chiude FreePOPs
In pratica il controllo "If active" è fatto sul software di posta, non su FreePOPs
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Re: VBS-Chiusura di un programma legata alla chiusura diun altro

Postdi archimede » 12/11/09 11:33

Dylan666 ha scritto:In pratica il controllo "If active" è fatto sul software di posta, non su FreePOPs
Non mi pare:
Codice: Seleziona tutto
active = IsActive("freepopsd.exe",objWMIService)
Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Re: VBS-Chiusura di un programma legata alla chiusura diun altro

Postdi Dylan666 » 12/11/09 11:45

Sorry :P
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Re: VBS-Chiusura di un programma legata alla chiusura diun altro

Postdi nerolubo85 » 13/11/09 00:37

Eppure confermo che la porzione di codice responsabile di questo strano comportamento è quella postata da Dylan666.
Infatti ho provato a far lanciare allo script un altro programma (sTunnel) insieme a FreePOPs e ad aggiungere questa riga:

[code]If active = False Then
TerminateSingleIstance "freepopsd.exe",objWMIService
TerminateSingleIstance "stunnel-4.08.exe",objWMIService
End If[/code]

e anche per lui vale la stessa cosa: alla chiusura del client di posta viene terminato sia FreePOPs che sTunnel...
Ci sono i fantasmi :?: :?: :?:
nerolubo85
Utente Senior
 
Post: 124
Iscritto il: 04/12/05 11:33

Re: VBS-Chiusura di un programma legata alla chiusura diun altro

Postdi nerolubo85 » 15/11/09 17:49

Mistero svelato!

Codice: Seleziona tutto
If mailClientCla = VbCrLf Then
  sh.Run """" & mailClientPath & """",1,true
Else
  sh.Run """" & mailClientPath & """ " & mailClientCla,1,true
End If


Il parametro “true” della funzione “Run” mette in pausa l'esecuzione dello script fino a quando il programma lanciato non viene terminato. Dopodiché vengono eseguite anche tutte le istruzioni seguenti, quindi viene terminato freepopsd.exe e lo script viene chiuso.
"active = False" che mi aveva confuso viene utilizzato solo come controllo per sapere se FreePOPs è stato lanciato da noi oppure se era già in esecuzione prima dello script. In questo caso non deve essere chiuso.
Spero di essere stato di aiuto anche a qualcun altro. Bye
nerolubo85
Utente Senior
 
Post: 124
Iscritto il: 04/12/05 11:33


Torna a Programmazione


Topic correlati a "VBS-Chiusura di un programma legata alla chiusura diun altro":


Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite