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

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

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

Im пытается закрыть chrome под 3 различными версиями окон: win7 ultimate, win7 home, winXP

Under Ultimate и XP: TSKILL chrome

Under Home: TASKKILL /IM chrome.exe

TSKILL chrome:

(Закрывает хром, без ошибок при перезапуске, , но с ошибками хрома восстановление при перезапуске)

TASKKILL /IM chrome.exe:

(Закрывает хром, без ошибок хрома при перезапуске, , но с ошибками при перезапуске) /F:

(Закрывает хром, без ошибок хрома при перезапуске, , но с ошибками при перезапуске) &007:

:

(Закрывает хром, без ошибок хрома при перезапуске, , но с ошибками при перезапуске)

:

:

: :

:

:

: : “невозможно завершить дочерние процессы (около 4-5), только силой с &007”)

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

Ответы (5)

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

Правильный способ закрытия/выхода из программы, в конечном счете, зависит от программного обеспечения. Однако, как правило, лучшая практика заключается в том, чтобы программы для Windows закрывались всякий раз, когда они получают сообщение WM_CLOSE. Правильное освобождение памяти и закрытие дескрипторов. Есть и другие сообщения, которые могут сигнализировать о закрытии приложения, но только от автора программы зависит, как каждое сообщение будет обработано.

taskkill /IM process.exe

Taskkill посылает сообщение WM_CLOSE, и только после этого приложение может решить, правильно ли закрыть программу. Вы также можете использовать опцию /T для сигнализации дочерних процессов.

Используйте опцию /F только в том случае, если вы хотите принудительно завершить процесс.

Другие опции будут включать отправку ключей Alt+F4, используя PowerShell, или приложения сторонних производителей.

Обновление к обновленному вопросу

Игнорируйте ошибки. Chrome генерирует множество процессов. Ошибки возникают, когда процесс не подтверждает сообщение WM_CLOSE, которое отправляет TASKKILL. Только процессы, имеющие цикл сообщений, смогут получить это сообщение, поэтому процессы, не имеющие цикла сообщений, будут генерировать эту ошибку. Скорее всего, эти процессы являются расширениями и плагинами хрома.

Чтобы скрыть ошибки, перехватите вывод

taskkill /IM chrome.exe >nul

Сводная информация: TASKKILL - это правильный способ через командную строку закрыть приложения в соответствии со своей реализацией WM_CLOSE и [ Microsoft KB, который я связал ]&003.

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

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

В нем есть команда “closeprocess”, которая предназначена для изящного закрытия процессов. Согласно документу, она не завершает работу приложений, а отправляет WM_CLOSE во все окна верхнего уровня целевого процесса. Пример использования

:

nircmd closeprocess chrome.exe

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

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?

Ответ на этот вопрос можно найти here (Microsoft link).

Вы можете отправить `WMCLOSE_ сообщения в любое окно, которое хотите закрыть. Многие окна обрабатывают _WMCLOSE`, чтобы подтолкнуть пользователя к сохранению документов.

Инструментом, который делает это правильно, является @Kill . Посмотрите также SendMsg .

  • *

Я не знаю, как это сделать пакетно, но для этого можно использовать vbscript. Моделирование клавиш Alt + F4 (равносильно сигналу `WMCLOSE`_).

Запустите и посмотрите на поведение этого скрипта ниже.

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.

Когда вы запускаете скрипт, notepad открыт, некоторые слова написаны, а затем сигнал к закрытию программы, см. рисунок ниже.

  • *

Дополнительные вопросы

Могу ли я запустить программу в свернутом виде, или в фоновом режиме с помощью vbscript?

Да. Используйте следующий код:

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

За дополнительной информацией обращайтесь к Run Method .

** Может ли хром перейти на url в vbscript?**

Dim iURL  
Dim objShell iURL = "www.google.com"
set objShell = CreateObject("Shell.Application") 
objShell.ShellExecute "chrome.exe", iURL, "", "", 1

Если по умолчанию используется хром, используйте:

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
3
3
2014-03-11 21:18:50 +0000

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

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

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

Ладно, не буду врать. Я увидел это на стекинге и подумал, что это сложный вопрос. Я только что потратил последние 2 часа на написание кода. И вот он…

После того, как вы выполните следующие шаги, вы можете набрать “TaskClose notepad.exe” после нажатия кнопки “Start”, и он автоматически сохранит все недокументированные файлы блокнота на рабочий стол. Он автоматически закроет chrome.exe и сохранит настройки восстановления.

Вы можете добавлять и удалять дополнительные настройки для других приложений при определенных условиях. Например:

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

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

Похожие вопросы

3
19
10
28
9