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?
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.
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é .
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.
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)
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}"
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
.
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:
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!