Fermer les programmes en ligne de commande (Windows)

49

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 la maison TASKKILL /IM chrome.exe


TSKILL chrome:

(Il ferme chrome, pas d'erreurs cmd,
mais les erreurs chromées sont restaurées lorsque vous le relancez)


TASKKILL /IM chrome.exe:

(Il ferme chrome, aucune erreur de chrome lors de la relance,
mais des erreurs dans cmd: "impossible de terminer les processus enfants (environ 4-5), uniquement par la force avec /F")


Dois-je ignorer les erreurs de commande cmd si relance chrome ne me montrer aucune erreur ?

NeoDev
la source
@MosheKatz: Pouvez-vous me montrer un exemple de code de sortie s'il vous plaît? J'aimerais savoir ce qui se passe lorsque je
clique
6
Taskkill envoie un message WM_CLOSE au programme cible à moins que / F (fin forcée) ne soit spécifié, pour permettre au programme de se nettoyer lui-même. Testez ceci avec le Bloc-notes - ouvrez un bloc-notes et tapez quelque chose, puis entrez "taskkill / im notepad.exe". Vous verrez une invite pour enregistrer les données.
Scott Rhee
@ScottRhee: J'ai déjà essayé de l'exécuter sans / F, mais semble être un proche impropre ... Est-ce que je me trompe?
NeoDev
@ScottRhee: J'essaie aussi avec Chrome! Parfois, lorsque je relance, il est indiqué "restaurer les onglets" dans une ligne jaune sous l'URL semblable à ceci: backroom.bostonproductions.com/wp-content/uploads/2012/07/…
neoDev
@ Roger C'est étrange car je ne reçois pas ce message avec Taskkill / IM chrome.exe. En tout cas, je crois que tu as fait la bonne chose. J'ai écrit une réponse ci-dessous alors essayez s'il vous plaît à la place.
Scott Rhee

Réponses:

43

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 cette /Toption pour signaler également les processus enfants.

Utilisez cette /Foption 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

Ignorez 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 qui ne possèdent pas de 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 la ligne de commande pour fermer les applications en fonction de son implémentation WM_CLOSE et de la base de connaissances Microsoft que j'ai liée .

David Ruhmann
la source
J'ai mis à jour ma question, jetez-y un coup d'œil
neoDev
@ Roger a mis à jour ma réponse.
David Ruhmann
qu'est-ce que cela signifie> nul?
NeoDev
10
>est l'opérateur de redirection pour le cmd.exe et nulest le vide d'espace où les choses vont jamais être entendu de nouveau.
David Ruhmann
9

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

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.

Scott Rhee
la source
J'ai mis à jour ma question, jetez-y un coup d'œil
neoDev
J'ai trouvé que cela fonctionnait mieux: nircmd gagne le titre proche "Titre de mon processus"
utilisateur1495323.
4
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( lien Microsoft ).

Vous pouvez envoyer des WM_CLOSEmessages à n’importe quelle fenêtre que vous souhaitez fermer. De nombreuses fenêtres WM_CLOSEpermettent d'inviter l'utilisateur à enregistrer des documents.

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


Je ne sais pas comment procéder par lots, mais vous pouvez utiliser vbscript pour cela. Simulation des touches Alt+ F4(é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 est la liste des noms de clé pour SendKeys.

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


Questions supplémentaires

Puis-je démarrer un programme réduit ou fond avec vbscript?

Oui. Utilisez le code suivant:

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

Pour plus d'informations, consultez le Run Method.

Chrome peut-il accéder à une 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 en évidence une application spécifique ( chrome.exe )?

Here dans 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 sous 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}"
stderr
la source
Puis-je démarrer un programme réduit ou fond avec vbscript?
NeoDev
1
@ Roger Si vous êtes intéressé, voyez ma réponse ici sur la façon de combiner Batch + JScript dans un seul fichier. JScript peut faire presque tout ce que VBScript peut faire dans un style C plus structuré.
David Ruhmann
et chrome peut-il aller à une URL dans vbscript?
NeoDev
Existe-t-il un moyen de mettre en évidence une application spécifique (chrome.exe)?
NeoDev
Oui, j'essaie, mais si après un certain délai (WScript.Sleep 5000), j'ai (WshShell.AppActivate "google chrome"), si pendant cette période je clique sur une autre fenêtre, Google Chrome ne vient pas à l'avant , je peux voir son objectif uniquement dans la barre d’outils ....
neoDev
3

Certains utilitaires de ligne de commande peuvent envoyer un WM_SYSCOMMANDmessage approprié (avec SC_CLOSEla 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 , un interpréteur de commandes et un processeur de script de commande pour Windows, est appelé TASKEND.

JdeBP
la source
J'ai mis à jour ma question, jetez-y un coup d'œil
neoDev
2

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 déroulantes 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!

Riches
la source