web-dev-qa-db-fra.com

Fermer les programmes en ligne de commande (Windows)

Quelle est la bonne façon de fermer/quitter des programmes en ligne de commande, comme si vous appuyiez sur le bouton de fermeture "X" dans le coin de la fenêtre?

J'essaie de fermer chrome sous 3 versions différentes de Windows: Win7 Ultimate, Win7 Home, WinXP

Sous Ultimate et XP: TSKILL chrome

Sous Accueil: TASKKILL /IM chrome.exe


TSKILL chrome:

(Il ferme chrome, pas d'erreurs cmd,
mais erreur chromée restaurer lors du relancement)


TASKKILL /IM chrome.exe:

(Il ferme chrome, pas d'erreur de chrome lors du relancement,
mais erreurs dans cmd: "impossible de terminer les processus enfants (environ 4-5), uniquement par la force avec /F")


Dois-je ignorer les erreurs enfants cmd si, lors du relancement, Chrome ne montre aucune erreur?

47
neoDev

La manière correcte de fermer/quitter un programme dépend finalement du logiciel. Toutefois, il est généralement recommandé de fermer les programmes Windows dès qu’ils reçoivent le message WM_CLOSE. Libérer correctement la mémoire et fermer les poignées. D'autres messages peuvent signaler la fermeture de l'application, mais il appartient à l'auteur du logiciel de gérer le traitement de chaque message.

taskkill /IM process.exe

taskkill envoie le message WM_CLOSE et il appartient ensuite à l'application de fermer correctement ou non. Vous pouvez également utiliser l'option /T pour signaler également les processus enfants.

Utilisez l'option /F uniquement si vous souhaitez forcer la fin du processus.

D'autres options incluent l'envoi des touches Alt + F4, à l'aide de PowerShell ou d'applications tierces.

Mettre à jour une question mise à jour

Ignore les erreurs. Chrome génère de nombreux processus. Les erreurs surviennent lorsqu'un processus ne reconnaît pas le message WM_CLOSE envoyé par TASKKILL. Seuls les processus avec une boucle de message pourront recevoir le message. Par conséquent, les processus sans boucle de message généreront cette erreur. Très probablement, ces processus sont les extensions et les plug-ins de chrome.

Pour masquer les erreurs capturer la sortie

taskkill /IM chrome.exe >nul

Résumé: TASKKILL est le moyen approprié, via une ligne de commande, de fermer les applications pour son implémentation WM_CLOSE et le Microsoft KB que j'ai lié .

40
David Ruhmann

Essayez NirCmd (Téléchargement: x86x64 )

Il a la commande "closeprocess" qui est conçue pour fermer les processus en douceur. Conformément à son document, il ne met pas fin aux applications, mais envoie WM_CLOSE à toutes les fenêtres de niveau supérieur du processus cible.

exemple d'utilisation:

nircmd closeprocess chrome.exe

Si cela ne fonctionne pas, je parie que votre application nécessite une procédure de nettoyage inhabituelle. J'aimerais voir ce qui se passe à l'intérieur, alors faites-le-moi savoir quelle est votre application cible.

5
Scott Rhee
What is the proper way to close/exit programs from command line,
similar to pressing the "X" close button in the corner of the window?

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

Vous pouvez envoyer WM_CLOSE des messages à n’importe quelle fenêtre que vous souhaitez fermer. De nombreuses fenêtres gèrent WM_CLOSE pour inviter l'utilisateur à enregistrer les documents.

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


Je ne sais pas comment faire cela en batch, mais vous pouvez utiliser vbscript pour cela. Simuler le Alt + F4 touches (équivaut à signaler WM_CLOSE).

Exécuter et regarder le comportement de ce script ci-dessous.

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

' Start Notepad.exe
WshShell.Run "%windir%\notepad.exe"

' Select, or bring Focus to a window named `Notepad`
WshShell.AppActivate "Notepad"

' Wait for 4 seconds
WScript.Sleep 4000

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

Here sont les noms de clé de liste pour SendKeys.

Lorsque vous exécutez le script, le bloc-notes notepad est ouvert, des mots sont écrits, puis un signal de fermeture du programme est délivré (voir l'illustration ci-dessous).


Questions supplémentaires

Puis-je démarrer un programme minimisé ou un arrière-plan avec vbscript?

Oui. Utilisez le code suivant:

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

Pour plus d'informations, consultez Run Method .

Chrome peut-il accéder à certaines URL dans vbscript?

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

Si chrome est la valeur par défaut, utilisez:

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

Source

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

Here dans un exemple.

Je souhaite 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)

' Select, or bring Focus to Google Chrome
WshShell.AppActivate "Google Chrome"

' Wait for 5 seconds
WScript.Sleep 5000

WshShell.SendKeys "%{F4}"
4
stderr

Certains utilitaires de ligne de commande peuvent envoyer un WM_SYSCOMMAND message approprié (avec SC_CLOSE comme commande) à la fenêtre de niveau supérieur d'un programme. Je suis sûr qu'au moins un d'entre eux sera mentionné sous peu. (Ensuite, quelqu'un mentionnera AutoIt. Ensuite, une réponse vous expliquera comment procéder avec PowerShell et CloseMainWindow().)

L'utilitaire de ligne de commande fourni en tant que commande intégrée dans TCC de JP Software, interpréteur de commandes et processeur de script de commande pour Windows, s'appelle TASKEND .

3
JdeBP

Bon, je ne vais pas mentir. J'ai vu cela sur stackoverflow et j'ai pensé que c'était une question difficile. Soooo je viens de passer les 2 dernières heures à écrire du code. Et le voici ....

Après avoir suivi les étapes ci-dessous, vous pouvez taper «TaskClose notepad.exe» après avoir cliqué sur «Démarrer» pour enregistrer automatiquement tous les fichiers du bloc-notes non documentés sur le bureau. Il ferme automatiquement chrome.exe et enregistre 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"

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

'Example 2: =============================================
ElseIf InStr(WScript.arguments(0), "notepad") Then 'I know, already in my autoapps
    SmartSendKeys strOutput,"","%{F4}|%s|{autosave}.txt" 'Activate Alt+4 + Save File + {AutoSave} = autoincrement filename
'========================================================

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

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

  • Recueille l'exécutable.
  • Interroge les noms d'applications exécutables dans la liste des tâches.
  • Effectue une procédure "Alt + TAB (x)" jusqu'à ce que la fenêtre soit vérifiée.
  • Puis exécute les commandes de défilement que ce soit "Alt + F4" ou même dans des cas extrêmes
  • Alt + F4
  • Activer Sauvegarder
  • 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:\Utilisateurs\VotreNomUtilisateur \"

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 très amusant d'écrire et je suis plus heureux de le terminer que de montrer la réponse. Passe une bonne semaine!

2
Rich