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


49

Який правильний спосіб закрити / вийти з програм з командного рядка, подібний до натискання кнопки "X" закрити в куті вікна?

Я намагаюся закрити хром під 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 не показувати мені помилок ?


@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 або сторонніх додатків.

Оновити до оновленого питання

Ігноруйте, помилки. Chrome генерує багато процесів. Помилки виникають, коли процес не підтверджує повідомлення WM_CLOSE, яке надсилає TASKKILL. Лише процеси з циклом повідомлень зможуть отримувати повідомлення, тому процеси, у яких немає циклу повідомлень, генеруватимуть цю помилку. Швидше за все, ці процеси - це хромовані розширення та плагіни.

Щоб приховати помилки, захоплюйте вихід

taskkill /IM chrome.exe >nul

Підсумок: TASKKILL - це правильний спосіб за допомогою командного рядка закрити програми відповідно до його реалізації WM_CLOSE та Microsoft KB, який я пов’язав .


Я оновив своє запитання, будь ласка, подивіться на нього
neoDev

@Roger оновив мою відповідь.
Девід Руманн

що це означає> нуль?
neoDev

10
>є оператором переадресації для cmd.exe і nulє порожнечею простору, куди речі йдуть, щоб більше ніколи не чути.
Девід Руманн

9

Спробуйте NirCmd (Завантажити: x86 x64 )

Він має команду "closeprocess", яка призначена для вишуканого закриття процесів. Згідно з документом, він не припиняє програми, а надсилає WM_CLOSEдо всіх вікон верхнього рівня цільового процесу.

приклад використання:

nircmd closeprocess chrome.exe

Якщо це не працює, я думаю, що у вашій заявці є незвичайна процедура очищення. Я хотів би побачити, що відбувається всередині, тому, будь ласка, повідомте мені, яка ваша цільова програма.


Я оновив своє запитання, будь ласка, подивіться на нього
neoDev

Я вважаю, що це працює краще: nircmd win close 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

Якщо за замовчуванням є хром, використовуйте:

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}"

Чи можу я запустити мінімізовану програму або тло з vbscript?
neoDev

1
@Roger Якщо вам цікаво, дивіться тут мою відповідь про те, як поєднати 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.


Я оновив своє запитання, будь ласка, подивіться на нього
neoDev

2

Добре, не брешу. Я побачив це на стаковому потоці і подумав, що це складне питання. Soooo, я щойно провів останні 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 та batch виконують такі процедури:

  • Збирає виконуваний файл.
  • Запитує імена виконуваних додатків із списку завдань.
  • Виконує процедуру "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: \ Користувачі \ ВашеUserName \"

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

Це було багато цікавого для написання, і я більше радий його закінченню, ніж фактично показую відповідь. Гарного тижня!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.