Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

5 réponses
Avatar
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

5 réponses

Avatar
jbongran
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

Avatar
Gilles LAURENT
"Glenn Gagné" a écrit dans le message de
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
Avatar
moi
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
Avatar
moi
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
Avatar
Glenn Gagné
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" a écrit dans le message de
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