Закрыть программы из командной строки (Windows)
Как правильно закрыть / закрыть программы из командной строки, аналогично нажатию кнопки закрытия "X" в углу окна?
Я пытаюсь закрыть Chrome под 3 различными версиями Windows: Win7 Ultimate, Win7 Home, WinXP
Под Ultimate и XP: TSKILL chrome
Под домом: TASKKILL /IM chrome.exe
TSKILL chrome
:
(Закрывает хром, нет ошибок cmd,
но ошибка хрома восстанавливается при перезапуске)TASKKILL /IM chrome.exe
:
(Он закрывает хром, никаких ошибок хрома при его повторном запуске,
но ошибки в cmd: "невозможно завершить дочерние процессы (около 4-5), только принудительно с /F
")
Должен ли я игнорировать дочерние ошибки cmd, если при повторном запуске Chrome не показывает ошибок?
5 ответов
Правильный способ закрыть / закрыть программу в конечном итоге зависит от программного обеспечения. Однако, как правило, рекомендуется закрывать программы Windows всякий раз, когда они получают сообщение WM_CLOSE. Правильно освобождая память и закрывая ручки. Существуют и другие сообщения, которые могут сигнализировать о закрытии приложения, но как автор обрабатывает каждое сообщение, зависит от автора программного обеспечения.
taskkill /IM process.exe
taskkill отправляет сообщение WM_CLOSE, и затем дело за приложением, правильно ли закрыть. Вы также можете использовать /T
возможность также сигнализировать дочерние процессы.
Используйте только /F
опция, если вы хотите принудительно завершить процесс.
Другие варианты включают отправку клавиш Alt+F4, использование PowerShell или сторонних приложений.
Обновить до обновленного вопроса
Проигнорируйте ошибки. Хром генерирует много процессов. Ошибки возникают, когда процесс не подтверждает сообщение WM_CLOSE, которое отправляет TASKKILL. Только процессы с циклом сообщений смогут получать сообщение, поэтому процессы, у которых нет цикла сообщений, будут генерировать эту ошибку. Скорее всего, эти процессы являются расширениями и плагинами Chrome.
Чтобы скрыть ошибки захвата вывода
taskkill /IM chrome.exe >nul
Описание: TASKKILL - это правильный способ с помощью командной строки закрывать приложения в соответствии с его реализацией WM_CLOSE и Microsoft KB, которую я связал.
Попробуйте NirCmd (Загрузить: x86 x64)
Он имеет команду "closeprocess", которая предназначена для корректного закрытия процессов. Согласно его документу, он не завершает приложения, но отправляет WM_CLOSE
для всех окон верхнего уровня целевого процесса.
пример использования:
nircmd closeprocess chrome.exe
Если это не сработает, держу пари, в вашем приложении необычная процедура очистки. Я хотел бы посмотреть, что происходит внутри, поэтому, пожалуйста, дайте мне знать, какое у вас целевое приложение.
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?
Ответ на этот вопрос можно найти here
(Ссылка Microsoft).
Ты можешь отправить WM_CLOSE
сообщения в любое окно, которое вы хотите закрыть. Многие окна обрабатывают WM_CLOSE
предложить пользователю сохранить документы.
Инструмент, который делает это правильно, @Kill
, Смотрите также SendMsg.
Я не знаю, как сделать это в пакетном режиме, но вы могли бы использовать VBScript для этого. Имитация клавиш Alt + F4 (приравнивается к сигналу WM_CLOSE
).
Запустите и посмотрите на поведение этого скрипта ниже.
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
это список ключей имен для SendKeys.
Когда вы запускаете скрипт, блокнот открыт, некоторые слова пишутся, а затем подается сигнал о закрытии программы, см. Рисунок ниже.
Дополнительный вопрос
Можно ли запустить свернутую программу или фон с vbscript?
Да. Используйте следующий код:
WshShell.Run "%windir%\notepad.exe", 2
Для получения дополнительной информации проверьте Run Method
,
Может ли Chrome перейти на какой-либо URL-адрес в VBScript?
Dim iURL
Dim objShell iURL = "www.google.com"
set objShell = CreateObject("Shell.Application")
objShell.ShellExecute "chrome.exe", iURL, "", "", 1
Если по умолчанию используется chrome, используйте:
set objShell = CreateObject("WScript.Shell")
objShell.run(iURL)
Source
Есть ли способ привлечь внимание к конкретному приложению (chrome.exe)?
Here
в примере.
Я хочу отправить alt+f4 ТОЛЬКО в Chrome, независимо от того, что я делаю с другими окнами.
Следующий код работает на 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}"
Есть несколько утилит командной строки, которые могут отправлять подходящие WM_SYSCOMMAND
сообщение (с SC_CLOSE
в качестве команды) в окно верхнего уровня программы. Я уверен, что по крайней мере один будет упомянут в ближайшее время. (Тогда кто-то упомянет AutoIt. Тогда будет ответ, показывающий, как это сделать с помощью PowerShell и CloseMainWindow()
.)
Утилита командной строки, которая поставляется как встроенная команда в TCC от JP Software, интерпретатор команд и процессор командных сценариев для Windows, называется TASKEND
,
Хорошо, не собираюсь лгать. Я видел это на stackoverflow и думал, что это сложный вопрос. Тааак я только что провел последние 2 часа, написав код. И вот оно ....
Выполнив следующие действия, вы можете набрать "TaskClose notepad.exe" после нажатия "Пуск", и он автоматически сохранит все недокументированные файлы блокнота на рабочем столе. Он автоматически закроет chrome.exe и сохранит настройки восстановления.
Вы можете добавлять и удалять дополнительные настройки для других приложений в условиях if. Например:
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
VBS и командные файлы выполняют следующие процедуры:
- Собирает исполняемый файл.
- Запрашивает имена исполняемых приложений из списка задач.
- Выполняет процедуру "Alt + TAB (x)", пока не проверит, открыто ли окно.
- Затем выполняет команды прокрутки, будь то "Alt + F4" или даже в крайних случаях
- Alt + F4
- Активировать Сохранить
- AutoIncrememnt Имя файла
- Выйти из приложения.
ReturnAppList.bat: установить в "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: установить в "C: \ windows \ system32 \" И "C: \ Users \ YourUserName \"
C:\windows\system32\wscript.exe c:\windows\system32\taskclose.vbs %1
TaskClose.vbs: установить в "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
Это было очень весело писать, и я больше рад закончить его, чем показывать ответ. Желаю хорошей недели!