VBS, WSH, BAT ou CMD - Pour fermer une application en cours (et non la tuer)

Le
Glenn Gagné
Bonjour,

Je cherche une méthode facile pour permettre la fermeture d'une application
en cours depuis un script (que ce soit VBS, WSH, CMD ou BAT) sans pour
autant tuer (kill) le processus (afin de ne pas corrompe les fichiers
ouverts.

Le but de l'expérience:

C'est de fermer Outlook s'il est ouvert avant de lancer une défragmentation
et/ou un backup planifié.

-

Le tout sera exécuté sur des stations Windows 2000 Pro et XP Pro.

-

Après quelques recherches, j'ai trouvé une petite application au nom de
nirCmd qui permet de faire ceci:

nircmd closeprocess outlook.exe

* Qui ferme le processus Outlook.exe s'il est présent.

J'avoue que je pourrais m'en tenir à cette solution, mais après lecture de
l'aide de cette application j'ai remarqué que l'action en "background" pour
faire cela était de faire appel à la notification API WM_CLOSE de Microsoft.
Cette notification existe depuis Windows 95/NT 3.1.

Donc je voulais savoir, puisque je ne trouve rien pour le moment de
pertinent, si l'appel d'un API comme WM_CLOSE pouavit être demandé depuis un
VBScript, un Windows Script ou tout simplement par un Batch File afin
d'éviter l'utilisation d'un programme externe comme nircmd ?

Ou bien, existe-t-il un équivalent pour fermer un processus en marche en
VBS, WSH ou CMD ?

Merci de votre aide

Glenn
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
jbongran
Le #655552
Glenn Gagné wrote:
Bonjour,

Je cherche une méthode facile pour permettre la fermeture d'une
application en cours depuis un script (que ce soit VBS, WSH, CMD ou
BAT) sans pour autant tuer (kill) le processus (afin de ne pas
corrompe les fichiers ouverts.

Le but de l'expérience:

C'est de fermer Outlook s'il est ouvert avant de lancer une
défragmentation et/ou un backup planifié.

----------------------------------

Le tout sera exécuté sur des stations Windows 2000 Pro et XP Pro.

----------------------------------

Après quelques recherches, j'ai trouvé une petite application au nom
de nirCmd qui permet de faire ceci:

nircmd closeprocess outlook.exe

* Qui ferme le processus Outlook.exe s'il est présent.

J'avoue que je pourrais m'en tenir à cette solution, mais après
lecture de l'aide de cette application j'ai remarqué que l'action en
"background" pour faire cela était de faire appel à la notification
API WM_CLOSE de Microsoft. Cette notification existe depuis Windows
95/NT 3.1.

Donc je voulais savoir, puisque je ne trouve rien pour le moment de
pertinent, si l'appel d'un API comme WM_CLOSE pouavit être demandé
depuis un VBScript, un Windows Script ou tout simplement par un Batch
File afin d'éviter l'utilisation d'un programme externe comme nircmd ?

Ou bien, existe-t-il un équivalent pour fermer un processus en marche
en VBS, WSH ou CMD ?

Merci de votre aide

Glenn


Peut être ça:
http://ourworld.compuserve.com/homepages/Guenter_Born/WSHBazaar/WSHDynaCall.htm
ou ça:
http://www.softpedia.com/get/System/Launchers-Shutdown-Tools/WM-CLOSE.shtml

Gilles LAURENT
Le #655551
"Glenn Gagné" news:%
| Bonjour,

Bonjour,

| Je cherche une méthode facile pour permettre la fermeture d'une
| application en cours depuis un script (que ce soit VBS, WSH, CMD ou
| BAT) sans pour autant tuer (kill) le processus (afin de ne pas
| corrompe les fichiers ouverts.
|
| Le tout sera exécuté sur des stations Windows 2000 Pro et XP Pro.

Le script VBScript ci-dessous essaye tout d'abord de fermer
l'application Microsoft Outlook (Message WM_CLOSE). Si l'application ne
répond pas au message de fermeture (timeout 2 secondes) alors il emploie
les grands moyens (Kill)

--- CloseOrKill.vbs ---
Set oSh=CreateObject("WScript.Shell")
Set oWMi=GetObject("winmgmts:/root/cimv2")
Set colProcs=oWmi.ExecQuery( _
"SELECT * FROM Win32_Process " & _
"WHERE Name='outlook.exe'")
For Each oProc In colProcs
If oSh.AppActivate(oProc.ProcessId) Then
WScript.Sleep (100)
oSh.SendKeys "%{F4}" ' WM_CLOSE
WScript.Sleep (2000)
If oSh.AppActivate(oProc.ProcessId) Then
oProc.Terminate () ' Kill
End If
End If
Next
--- CloseOrKill.vbs ---

--
Gilles LAURENT
http://glsft.free.fr
moi
Le #655550
Notre ami Gilles LAURENT tapota :

Bonjour,

Sijenemabuz en remplaçant 'outlook.exe' par n'importe quel nom
d'exécutable on obtient là un tueur à gage efficace et peu onéreux ...
On peut aussi modifier le TimeOut pour le cas où l'appli a du boulot
avant de dormir ...

Ce qui donnerait :

' --- CloseOrKill.vbs ---
NomExe = "taskmgr.exe"
TimeOut = 4
Set oSh=CreateObject("WScript.Shell")
Set oWMi=GetObject("winmgmts:/root/cimv2")
Requete = "SELECT * FROM Win32_Process WHERE Name='" & NomExe & "'"
Set colProcs=oWmi.ExecQuery(Requete)
For Each oProc In colProcs
If oSh.AppActivate(oProc.ProcessId) Then
WScript.Sleep (100)
oSh.SendKeys "%{F4}"
WScript.Sleep (1000*TimeOut)
If oSh.AppActivate(oProc.ProcessId) Then
oProc.Terminate ()
End If
End If
Next
' --- CloseOrKill.vbs ---

A+

HB
moi
Le #655549
Re,

ceci étant si l'appli risque de poser la question "voulez vous
enregistrer etc ..." et , en l'abscence de réponse elle va attendre
puis mourir soudainement sans avoir rien enregistré ...

Il faudrait guetter l'arrivée éventuelle de la petite boite de
dialogue qui pose ce type de question

j'ia fait qq test et ce qui suit semble convenir mais peut-être
certaines appli ont un comportement différent ...

A+

HB


NomExe = "winword.exe"
TimeOut = 2
Set oSh=CreateObject("WScript.Shell")
Set oWMi=GetObject("winmgmts:/root/cimv2")
Requete = "SELECT * FROM Win32_Process WHERE Name='" & NomExe & "'"
Set colProcs=oWmi.ExecQuery(requete)
For Each oProc In colProcs
If oSh.AppActivate(oProc.ProcessId) Then
WScript.Sleep (100)
oSh.SendKeys "%{F4}"

WScript.Sleep (150) ' Pour Oui enregistrer si ça arrive
oSh.SendKeys "~"
WScript.Sleep (150) '' Pour valider le nom du fichier choisi
par défaut ...
oSh.SendKeys "~"
WScript.Sleep (1000*TimeOut)
If oSh.AppActivate(oProc.ProcessId) Then
oProc.Terminate ()
End If
End If
Next
Glenn Gagné
Le #655547
Merci à tous,

Dans mon cas, pour éviter la perte de données, je vais m'en tenir à fermer
le processus simplement. Si une boîte de dialogue apparaît, je ne tuerai pas
le processus, je vais plutôt faire un ECHO de la situation à l'utilisateur
pour l'informer que la défragmentation programmée ne sera pas optimale et/ou
la sauvegarde en cours ne pourra pas se faire !

Je ne veux pas effectivement crasher un PST en forçant la fermeture (kill
process).

Merci énormément pour la formulation du WM_CLOSE avec VBS.

Glenn Gagné
Technicien MCP/TI


"moi" news:
Re,

ceci étant si l'appli risque de poser la question "voulez vous
enregistrer etc ..." et , en l'abscence de réponse elle va attendre
puis mourir soudainement sans avoir rien enregistré ...

Il faudrait guetter l'arrivée éventuelle de la petite boite de
dialogue qui pose ce type de question

j'ia fait qq test et ce qui suit semble convenir mais peut-être
certaines appli ont un comportement différent ...

A+

HB


NomExe = "winword.exe"
TimeOut = 2
Set oSh=CreateObject("WScript.Shell")
Set oWMi=GetObject("winmgmts:/root/cimv2")
Requete = "SELECT * FROM Win32_Process WHERE Name='" & NomExe & "'"
Set colProcs=oWmi.ExecQuery(requete)
For Each oProc In colProcs
If oSh.AppActivate(oProc.ProcessId) Then
WScript.Sleep (100)
oSh.SendKeys "%{F4}"

WScript.Sleep (150) ' Pour Oui enregistrer si ça arrive
oSh.SendKeys "~"
WScript.Sleep (150) '' Pour valider le nom du fichier choisi
par défaut ...
oSh.SendKeys "~"
WScript.Sleep (1000*TimeOut)
If oSh.AppActivate(oProc.ProcessId) Then
oProc.Terminate ()
End If
End If
Next



Publicité
Poster une réponse
Anonyme