46

Как правильно закрыть / закрыть программы из командной строки, аналогично нажатию кнопки закрытия "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 ответов5

40

Правильный способ закрыть / закрыть программу в конечном итоге зависит от программного обеспечения. Однако, как правило, рекомендуется закрывать программы 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, которую я связал.

5

Попробуйте NirCmd (Загрузить: x86 x64)

Он имеет команду "closeprocess", которая предназначена для корректного закрытия процессов. Согласно его документу, он не завершает приложения, а отправляет WM_CLOSE во все окна верхнего уровня целевого процесса.

пример использования:

nircmd closeprocess chrome.exe

Если это не сработает, держу пари, в вашем приложении необычная процедура очистки. Я хотел бы посмотреть, что происходит внутри, поэтому, пожалуйста, дайте мне знать, какое у вас целевое приложение.

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?

Ответ на этот вопрос можно найти 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}"
3

Существуют некоторые утилиты командной строки, которые могут отправлять подходящее сообщение WM_SYSCOMMANDSC_CLOSE в качестве команды) в окно верхнего уровня программы. Я уверен, что по крайней мере один будет упомянут в ближайшее время. (Тогда кто-то упомянет AutoIt. Затем будет ответ, показывающий, как это сделать с помощью PowerShell и CloseMainWindow() .)

Утилита командной строки, которая поставляется как встроенная команда в TCC JP Software, интерпретаторе команд и процессоре командных сценариев для Windows, называется TASKEND.

2

Хорошо, не собираюсь лгать. Я видел это на 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

Это было очень весело писать, и я больше рад закончить его, чем показывать ответ. Желаю хорошей недели!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .