Закрыть программы из командной строки (Windows)

49

Как правильно закрыть / закрыть программы из командной строки, аналогично нажатию кнопки закрытия «X» в углу окна?

Я пытаюсь закрыть Chrome под 3 различными версиями Windows: Win7 Ultimate, Win7 Home, WinXP

Под Ultimate и XP: TSKILL chrome

Под домом TASKKILL /IM chrome.exe


TSKILL chrome:

(Он закрывает chrome, нет ошибок cmd,
но при повторном запуске восстанавливается ошибка chrome )


TASKKILL /IM chrome.exe:

(Он закрывает Chrome, нет ошибок Chrome при повторном запуске,
но ошибки в cmd: «невозможно завершить дочерние процессы (около 4-5), только принудительно с помощью /F»)


Должен ли я игнорировать дочерние ошибки cmd, если при повторном запуске Chrome не показывает ошибок ?

neoDev
источник
@MosheKatz: Можете ли вы показать мне пример кода выхода, пожалуйста? Я хотел бы знать, что происходит, когда я нажимаю кнопку X.
neoDev
6
Taskkill отправляет сообщение WM_CLOSE целевой программе, если не указано / F (принудительное завершение), чтобы у программы была возможность очистить себя. Проверьте это с помощью Блокнота - откройте блокнот и введите что-нибудь там, и введите «taskkill / im notepad.exe». Вы увидите приглашение сохранить данные.
Скотт Ри
@ScottRhee: Я уже пытался запустить его без / F, но, похоже, не совсем близко ... Я ошибаюсь?
neoDev
@ ScottRhee: я тоже пытаюсь с Chrome! Иногда, когда я возобновить это говорит «восстановить вкладки» в желтой строке под URL , подобный следующему: backroom.bostonproductions.com/wp-content/uploads/2012/07/...
neoDev
@Roger Это странно, поскольку я не получаю это сообщение с помощью Taskkill / IM chrome.exe. В любом случае, я верю, что ты поступил правильно. Я написал ответ ниже, поэтому, пожалуйста, попробуйте.
Скотт Ри

Ответы:

43

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

Дэвид Руман
источник
Я обновил свой вопрос, пожалуйста, посмотрите на него
neoDev
@ Роджер обновил мой ответ.
Дэвид Руманн,
что это значит> нуль?
neoDev
10
>является оператором перенаправления для cmd.exe и nulявляется пробелом, в котором больше ничего не слышно.
Дэвид Руманн
9

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

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

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

nircmd closeprocess chrome.exe

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

Скотт Ри
источник
Я обновил свой вопрос, пожалуйста, посмотрите на него
neoDev
Я нашел, что это работает лучше: nircmd win close title "My process title"
user1495323
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}"
STDERR
источник
Можно ли запустить свернутую программу или фон с vbscript?
neoDev
1
@ Роджер Если интересно, посмотрите мой ответ здесь о том, как объединить Batch + JScript в один файл. JScript может делать почти все, что может делать VBScript, и в более структурированном стиле C.
Дэвид Руманн,
а может ли chrome перейти на какой-то URL в vbscript?
neoDev
Есть ли способ привлечь внимание к конкретному приложению (chrome.exe)?
neoDev
Да, я пытаюсь с этим, но если после некоторой задержки (WScript.Sleep 5000) у меня есть (WshShell.AppActivate "Google Chrome"), если в течение этого периода я нажимаю на какое-то другое окно, Google Chrome не выходит на первый план Я могу видеть его фокус только на панели инструментов ....
neoDev
3

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

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

JdeBP
источник
Я обновил свой вопрос, пожалуйста, посмотрите на него
neoDev
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

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

Богатый
источник