56 votes

Fermer les programmes à partir de la ligne de commande (Windows)

Quelle est la bonne manière de fermer/de quitter les programmes à partir de la ligne de commande, similaire à appuyer sur le bouton de fermeture "X" dans le coin de la fenêtre?

Je tente de fermer chrome sous 3 versions différentes de Windows : win7 ultimate, win7 home, winXP

Sous Ultimate et XP: TSKILL chrome

Sous Home: TASKKILL /IM chrome.exe

TSKILL chrome:

(Il ferme chrome, pas d'erreurs dans la cmd,
mais chrome affiche une erreur de restauration lors du relancement)

TASKKILL /IM chrome.exe:

(Il ferme chrome, pas d'erreurs de chrome lors du relancement, mais des erreurs dans la cmd : "impossible de mettre fin aux processus enfants (environ 4-5), seulement de force avec /F")

Dois-je ignorer les erreurs des processus enfants de la cmd si lors du relancement de chrome, aucune erreur n'apparaît?

48voto

David Ruhmann Points 1249

La manière appropriée de fermer/quitter un programme dépend finalement du logiciel. Cependant, en général, la meilleure pratique est que les programmes Windows se ferment chaque fois qu'ils reçoivent le message WM_CLOSE. Libérer correctement la mémoire et fermer les poignées. Il existe d'autres messages qui peuvent signaler la fermeture de l'application, mais c'est à l'auteur du logiciel de décider comment chaque message est géré.

taskkill /IM process.exe

taskkill envoie le message WM_CLOSE et il revient ensuite à l'application de se fermer correctement. Vous voudrez peut-être également utiliser l'option /T pour signaler également les processus enfants.

N'utilisez l'option /F que si vous voulez forcer la terminaison du processus.

D'autres options incluraient l'envoi des touches Alt+F4, l'utilisation de PowerShell, ou des applications tierces.

Mise à jour de la question mise à jour

Ignorez, les erreurs. Chrome génère de nombreux processus. Les erreurs surviennent lorsque un processus ne reconnaît pas le message WM_CLOSE que TASKKILL envoie. Seuls les processus avec une boucle de messages pourront recevoir le message, donc, les processus qui n'ont pas de boucle de messages généreront cette erreur. Il est très probable que ces processus soient les extensions et plugins de Chrome.

Pour masquer les erreurs, capturez la sortie

taskkill /IM chrome.exe >nul

Résumé: TASKKILL est la manière appropriée via la ligne de commande pour fermer les applications selon son implémentation WM_CLOSE et le Microsoft KB que j'ai lié.

9voto

Scott Rhee Points 1973

Essayez NirCmd (Télécharger : x86 x64)

Il possède la commande "closeprocess" qui est conçue pour fermer les processus de manière élégante. Selon sa documentation, elle ne termine pas les applications mais envoie WM_CLOSE à toutes les fenêtres de niveau supérieur du processus ciblé.

Exemple d'utilisation:

nircmd closeprocess chrome.exe

Si cela ne fonctionne pas, je parie que votre application a une procédure de nettoyage inhabituelle. J'aimerais savoir ce qui se passe à l'intérieur, alors veuillez me faire savoir quelle est votre application cible.

4voto

stderr Points 10006
Quelle est la bonne façon de fermer/arrêter les programmes à partir de la ligne de commande, similaire à appuyer sur le bouton de fermeture "X" dans le coin de la fenêtre?

La réponse à cette question peut être trouvée ici(lien Microsoft).

Vous pouvez envoyer des messages _WM_CLOSE à n'importe quelle fenêtre que vous souhaitez fermer. De nombreuses fenêtres gèrent WM_CLOSE_ pour demander à l'utilisateur de sauvegarder des documents.

Un outil qui le fait correctement est @Kill. Regardez aussi SendMsg.


Je ne sais pas comment faire cela en batch, mais vous pourriez utiliser le vbscript pour cela. En simulant les touches Alt + F4 (équivaut à un signal _WM_CLOSE_).

Exécutez et regardez le comportement de ce script ci-dessous.

Set WshShell = WScript.CreateObject("WScript.Shell")

' Démarrer Notepad.exe
WshShell.Run "%windir%\notepad.exe"

' Sélectionnez, ou mettez le focus sur une fenêtre nommée `Notepad`
WshShell.AppActivate "Notepad"

' Attendre 4 secondes
WScript.Sleep 4000

WshShell.SendKeys "Foo"
WshShell.SendKeys "{ENTER}"
WshShell.SendKeys "Bar"
WshShell.SendKeys "{ENTER}"
WshShell.SendKeys "{CAPSLOCK}"
WshShell.SendKeys "baz"
WshShell.SendKeys "%{F4}"

Ici se trouve la liste des noms de touches pour SendKeys.

Lorsque vous exécutez le script, le notepad est ouvert, quelques mots sont écrits et ensuite un signal pour fermer le programme est envoyé, voir l'image ci-dessous.


Questions supplémentaires

Puis-je démarrer un programme en mode réduit, ou en arrière-plan avec le vbscript?

Oui. Utilisez le code suivant:

WshShell.Run "%windir%\notepad.exe", 2

Pour plus d'informations, consultez la Méthode Run.

Chrome peut-il aller sur une URL spécifique avec vbscript?

Dim iURL  
Dim objShell iURL = "www.google.com"
set objShell = CreateObject("Shell.Application") 
objShell.ShellExecute "chrome.exe", iURL, "", "", 1

Si Chrome est le navigateur par défaut, utilisez:

set objShell = CreateObject("WScript.Shell")
objShell.run(iURL)

<a href="https://stackoverflow.com/a/13401872/1608936"><code>Source</code></a>

Y a-t-il un moyen de mettre le focus sur une application spécifique (chrome.exe)?

Voici un exemple.

Je veux envoyer alt+F4 UNIQUEMENT à Chrome, indépendamment de ce que je fais avec d'autres fenêtres.

Le code suivant fonctionne sur Windows 8.

Dim objShell

iURL = "www.google.com.br"

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run(iURL)

' Sélectionnez, ou mettez le focus sur Google Chrome
WshShell.AppActivate "Google Chrome"

' Attendre 5 secondes
WScript.Sleep 5000

WshShell.SendKeys "%{F4}"

3voto

JdeBP Points 25711

Il existe quelques utilitaires en ligne de commande qui peuvent envoyer un message WM_SYSCOMMAND approprié (avec SC_CLOSE comme commande) à la fenêtre de niveau supérieur d'un programme. Je suis sûr qu'au moins un sera mentionné bientôt. (Ensuite quelqu'un mentionnera AutoIt. Puis il y aura une réponse montrant comment le faire avec PowerShell et CloseMainWindow().)

L'utilitaire en ligne de commande qui est inclus en tant que commande intégrée dans TCC de JP Software, un interprète de commandes et un processeur de scripts de commandes pour Windows, s'appelle TASKEND.

2voto

melissa Points 43

D'accord, je ne vais pas mentir. J'ai vu cela sur stackoverflow et j'ai trouvé que c'était une question challengeante. Donc j'ai passé les 2 dernières heures à écrire du code. Et voici....

Après avoir suivi les étapes ci-dessous, vous pouvez taper "TaskClose notepad.exe" après avoir appuyé sur "Démarrer" et cela enregistrera automatiquement tous les fichiers du bloc-notes non enregistrés sur le bureau. Chrome.exe se fermera automatiquement et enregistrera les paramètres de restauration.

Vous pouvez ajouter et supprimer des paramètres supplémentaires pour d'autres applications dans les conditions if. Par exemple:

If InStr(SINGLECLOSEAPPS, WScript.arguments(0)) Then
    SmartSendKeys strOutput,"bypass","%{F4}"

ElseIf InStr(AUTOCLOSEAPPS, WScript.arguments(0)) Then
    SmartSendKeys strOutput,"","%{F4}|%s|{autoname}.txt|%s"

'Exemple 1: =============================================
ElseIf InStr(WScript.arguments(0), "outlook") Then
    SmartSendKeys strOutput,"","%{F4}" 'Activer Alt+4
'========================================================

'Exemple 2: =============================================
ElseIf InStr(WScript.arguments(0), "notepad") Then 'Je sais, déjà dans mes applications automatiques
    SmartSendKeys strOutput,"","%{F4}|%s|{autosave}.txt" 'Activer Alt+4 + Enregistrer le fichier + {AutoSave} = nom de fichier auto-incrémenté
'========================================================

Else
    SmartSendKeys strOutput,"bypass","%{F4}"
End If

Les fichiers vbs et batch exécutent les procédures suivantes:

  • Collectent l'exécutable.
  • Récupèrent les noms des applications exécutables de la liste des tâches.
  • Exécutent une procédure "Alt+TAB(x)" jusqu'à ce qu'ils vérifient que la fenêtre est ouverte.
  • Ensuite exécutent les commandes roulantes que ce soit "Alt+F4" ou même dans des cas extrêmes
  • Alt+F4
  • Activer Enregistrer
  • Nom de fichier auto-incrémenté
  • Quitter l'application.

ReturnAppList.bat : installer dans "C:\windows\system32\"

for /f "tokens=10 delims=," %%F in ('tasklist /v /fi "imagename eq %1" /fo csv') do @echo %%~F >>result.txt

TaskClose.bat : installer dans "C:\windows\system32\" ET "C:\Users\YourUserName\"

C:\windows\system32\wscript.exe c:\windows\system32\taskclose.vbs %1

TaskClose.vbs : installer dans "C:\windows\system32\"

Set WshShell = CreateObject("WScript.Shell")
Const SINGLECLOSEAPPS = "chrome.exe|iexplore.exe|firefox.exe"
Dim DEFAULTSAVELOCATION : DEFAULTSAVELOCATION = wshshell.SpecialFolders("Desktop")
Const AUTOCLOSEAPPS = "notepad.exe"

Const WshFinished = 1
Const WshFailed = 2
strCommand = "returnapplist.bat "
Set WshShellExec = WshShell.Exec(strCommand & WScript.Arguments(0))

WScript.sleep 2000

Select Case WshShellExec.Status
    Case WshFinished
    strOutput = LoadStringFromFile("result.txt")
    Case WshFailed
    strOutput = LoadStringFromFile("result.txt")
End Select

'SmartSendKeys(application_name_array, bypassclause, additionalcommands)
'========================
If InStr(SINGLECLOSEAPPS, WScript.arguments(0)) Then
    SmartSendKeys strOutput,"bypass","%{F4}"
ElseIf InStr(AUTOCLOSEAPPS, WScript.arguments(0)) Then
    SmartSendKeys strOutput,"","%{F4}|%s|{autoname}.txt|%s"
Else
    SmartSendKeys strOutput,"bypass","%{F4}"
End If

'SmartSendKeys(application_name_array, bypassclause, additionalcommands)
'========================
Function SmartSendkeys(fArr, LoopCount, RollCommands) 
    Dim x 
    Dim splt : splt = Split(farr, vbCrLf)
    If loopcount = "bypass" Then 
        x = 0
    Else
        x = UBound(splt)
    End If
    a = 0
    For s=0 To x
        If Len(splt(s)) > 1 Then
            Set objShell = WScript.CreateObject("WScript.Shell")
            c = 1 : tabs = ""
            Success = False
            Do Until Success = True
                Success = objShell.AppActivate(Trim(splt(s)))
                If success <> True Then
                    If c = 1 Then 
                        tabs = "{TAB}"
                    Else
                        tabs = "{TAB " & c & "}"
                    End If
                    'wscript.echo "Activating: " & "%" & tabs
                    WshShell.SendKeys "%" & tabs
                    WScript.Sleep 5000
                    c = c + 1
                    If c = 100 Then 
                        WScript.echo "App not found"
                        Exit Function
                    End If
                End If
            Loop
            Dim cmds : cmds = Split(rollcommands, "|")

            For Each cm In cmds
                If InStr(cm, "{autoname}") Then
                    Dim file_ext : file_ext = Split(cm, ".") 
                    cm = DEFAULTSAVELOCATION & "autosave" & a & "." & file_ext(1)
                    a = a + 1
                End If
                WshShell.SendKeys cm
                WScript.sleep 500

            Next
        End If
    Next
End Function

Function LoadStringFromFile(filename)
    Const fsoForReading = 1
    Const fsoForWriting = 2
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(filename, fsoForReading)
    Dim fulltext : fulltext = f.ReadAll
    LoadStringFromFile = fulltext
    f.Close
    fso.DeleteFile(filename)
End Function

C'était vraiment amusant à écrire et je suis plus content d'avoir fini que de montrer la réponse. Passez une excellente semaine!

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X