2014-03-11 20:25:46 +0000 2014-03-11 20:25:46 +0000
50
50

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

Quelle est la bonne façon de fermer/quitter des programmes à partir de la ligne de commande, comme en appuyant sur le bouton de fermeture “X” dans le coin de la fenêtre ?

J'essaie de fermer le chrome sous 3 versions différentes de fenêtres : win7 ultimate, win7 home, winXP

Under Ultimate and XP : TSKILL chrome

Under Home : TASKKILL /IM chrome.exe

TSKILL chrome :

(It closes chrome, no cmd errors, but chrome error restore when relaunch it)

TASKKILL /IM chrome.exe :

(It closes chrome, no chrome errors when relaunch it, but errors in cmd : “impossible de terminer les processus enfants (environ 4-5), seulement par la force avec /F”)

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

Réponses (5)

45
45
45
2014-03-11 21:51:34 +0000

La bonne façon de fermer ou de quitter un programme dépend en fin de compte du logiciel. Cependant, la meilleure pratique consiste généralement à 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. 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 traité.

taskkill /IM process.exe

taskkill envoie le message WM_CLOSE et c'est ensuite à l'application de décider si elle doit se fermer correctement. Vous pouvez également utiliser l'option /T pour signaler également les processus enfants.

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

Les autres options comprennent l'envoi des touches Alt+F4, l'utilisation de PowerShell ou d'applications tierces. 002

Mise à jour de la question

Ignorez les erreurs. Chrome génère de nombreux processus. Les erreurs sont dues au fait qu'un processus n'accuse pas réception du message WM_CLOSE que TASKKILL envoie. Seuls les processus avec une boucle de message pourront recevoir le message, par conséquent, les processus qui n'ont pas de boucle de message généreront cette erreur. Pour masquer les erreurs, il faut capturer la sortie

taskkill /IM chrome.exe >nul

Résumé: TASKKILL est le moyen approprié en ligne de commande pour fermer les applications selon son implémentation WM_CLOSE et la Ko Microsoft que j'ai liée .

9
9
9
2014-03-11 21:21:03 +0000

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

Il dispose d'une commande “closeprocess” qui est conçue pour fermer les processus avec élégance. Selon son document, elle ne termine pas les applications mais envoie WM_CLOSE à toutes les fenêtres de niveau supérieur du processus cible. Exemple d'utilisation de

:

nircmd closeprocess chrome.exe

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

4
4
4
2014-03-11 23:22:09 +0000
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 des messages `WMCLOSE_ à n'importe quelle fenêtre que vous souhaitez fermer. De nombreuses fenêtres gèrent _WMCLOSE` pour inviter l'utilisateur à enregistrer des documents.

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


Je ne sais pas comment faire cela en mode batch, mais vous pourriez utiliser le vbscript pour cela. Simulation des touches Alt + F4 (équivaut au signal `WMCLOSE`_).

Exécutez et regardez 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és pour SendKeys.

Lorsque vous exécutez le script, le notepad est ouvert, quelques mots sont écrits et ensuite un signal de fermeture du programme est délivré, voir l'image ci-dessous.


Questions supplémentaires

Puis-je lancer un programme minimisé, ou en arrière-plan avec vbscript?

Oui. Utilisez le code suivant :

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

Pour plus d'informations, consultez le site Run Method .

Peut-on aller sur 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

Y a-t-il un moyen de mettre l'accent sur une application spécifique (chrome. exe)? Here dans un exemple.

Je veux envoyer alt+f4 SEULEMENT vers 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}"
3
3
3
2014-03-11 21:18:50 +0000

Il existe des utilitaires de 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 de ces messages sera mentionné prochainement. (Ensuite, quelqu'un mentionnera AutoIt. Puis il y aura une réponse montrant comment le faire avec PowerShell et CloseMainWindow()).

L'utilitaire de ligne de commande qui est intégré dans JP Software’s TCC , un interpréteur de commandes et un processeur de scripts de commande pour Windows, est appelé TASKEND .

2
2
2
2014-03-12 01:37:30 +0000

D'accord, je ne vais pas mentir. J'ai vu ça sur stackoverflow et j'ai pensé que c'était une question difficile. Je viens de passer les deux 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 appuyé sur “Start” et il enregistrera automatiquement tous les fichiers non documentés du bloc-notes sur le bureau. Il fermera automatiquement chrome.exe et enregistrera les paramètres de restauration.

Vous pouvez ajouter et supprimer des paramètres supplémentaires pour d'autres applications sous 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 effectuent les procédures suivantes :

  • Récupère l'exécutable.
  • Demande les noms des applications exécutables hors de la liste des tâches.
  • Effectue une procédure “Alt+TAB(x)” jusqu'à ce qu'il ait vérifié que la fenêtre est ouverte.
  • Exécute ensuite les commandes roulantes que ce soit “Alt+F4” ou même dans des cas extrêmes
  • Alt+F4
  • Active la sauvegarde
  • AutoIncrememnt Filename
  • Quitte 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 très amusant à écrire et je suis plus heureux de le terminer que de montrer la réponse. Passez une bonne semaine !