Zamknij programy z wiersza poleceń (Windows)

49

Jaki jest właściwy sposób zamykania / zamykania programów z wiersza poleceń, podobny do naciskania przycisku zamykania „X” w rogu okna?

Próbuję zamknąć Chrome pod 3 różnymi wersjami systemu Windows: Win7 Ultimate, Win7 Home, WinXP

W Ultimate i XP: TSKILL chrome

Under Home TASKKILL /IM chrome.exe


TSKILL chrome::

(Zamyka chrome, brak błędów cmd,
ale przywrócenie błędu chrome po ponownym uruchomieniu)


TASKKILL /IM chrome.exe:

(Zamyka Chrome, nie ma błędów Chrome przy ponownym uruchomieniu,
ale błędy w cmd: „nie można zakończyć procesów potomnych (około 4-5), tylko siłą za pomocą /F”)


Czy powinienem zignorować błędy potomne cmd, jeśli przy ponownym uruchomieniu chrome nie pokazuje żadnych błędów ?

neoDev
źródło
@MosheKatz: Czy możesz mi pokazać przykład kodu wyjścia? Chciałbym wiedzieć, co się stanie, gdy
kliknę
6
Taskkill wysyła komunikat WM_CLOSE do programu docelowego, chyba że podano / F (wymuszone zakończenie), aby umożliwić programowi samodzielne wyczyszczenie się. Przetestuj to za pomocą Notatnika - otwórz notatnik i wpisz coś tam, a następnie wpisz „taskkill / im notepad.exe”. Zobaczysz monit o zapisanie danych.
Scott Rhee,
@ ScottRhee: Próbowałem już uruchomić go bez / F, ale wydaje się, że jest to niewłaściwe zamknięcie ... Czy się mylę?
neoDev,
@ScottRhee: Próbuję też z Chrome! Czasami, kiedy ożywienie mówi „przywrócić zakładki” w żółtej linii pod adresem URL podobnym do tego: backroom.bostonproductions.com/wp-content/uploads/2012/07/...
neoDev
@Roger To dziwne, ponieważ nie dostaję tego komunikatu za pomocą Taskkill / IM chrome.exe. W każdym razie uważam, że postąpiłeś właściwie. Poniżej napisałem odpowiedź, więc spróbuj zamiast tego.
Scott Rhee,

Odpowiedzi:

43

Właściwy sposób zamknięcia / wyjścia z programu ostatecznie zależy od oprogramowania. Jednak ogólnie najlepszą praktyką jest zamykanie programów Windows za każdym razem, gdy otrzymują komunikat WM_CLOSE. Prawidłowe zwalnianie pamięci i zamykanie uchwytów. Istnieją inne komunikaty, które mogą sygnalizować zamknięcie aplikacji, ale to od autora oprogramowania zależy, jak każda wiadomość będzie obsługiwana.

taskkill /IM process.exe

taskkill wysyła komunikat WM_CLOSE, a następnie to od aplikacji zależy, czy poprawnie się zamknie. Możesz także użyć tej /Topcji, aby zasygnalizować procesy potomne.

/FOpcji należy używać tylko, jeśli chcesz wymusić zakończenie procesu.

Inne opcje obejmują wysyłanie klawiszy Alt + F4, przy użyciu programu PowerShell lub aplikacji innych firm.

Zaktualizuj zaktualizowane pytanie

Zignoruj ​​błędy. Chrome generuje wiele procesów. Błędy powstają, gdy proces nie potwierdzi komunikatu WM_CLOSE, który wysyła TASKKILL. Tylko procesy z pętlą komunikatów będą mogły odbierać komunikat, dlatego procesy, które nie mają pętli komunikatów, wygenerują ten błąd. Najprawdopodobniej procesami tymi są rozszerzenia i wtyczki chrome.

Aby ukryć błędy, przechwyć dane wyjściowe

taskkill /IM chrome.exe >nul

Podsumowanie: TASKKILL to właściwy sposób, za pomocą wiersza poleceń, do zamykania aplikacji zgodnie z implementacją WM_CLOSE i Microsoft KB, które połączyłem .

David Ruhmann
źródło
Zaktualizowałem moje pytanie, proszę spojrzeć na nie
neoDev,
@Roger zaktualizował moją odpowiedź.
David Ruhmann
co to znaczy> nul?
neoDev,
10
>jest operatorem przekierowującym cmd.exe i nuljest pustką przestrzeni, w której nigdy więcej nie można usłyszeć.
David Ruhmann
9

Wypróbuj NirCmd (Pobierz: x86 x64 )

Posiada komendę „closeprocess”, która została zaprojektowana tak, aby z wdziękiem zamykać procesy. Zgodnie z dokumentem nie zamyka aplikacji, ale wysyła WM_CLOSEdo wszystkich okien najwyższego poziomu procesu docelowego.

przykład użycia:

nircmd closeprocess chrome.exe

Jeśli to nie zadziała, założę się, że twoja aplikacja ma nietypową procedurę czyszczenia. Chciałbym zobaczyć, co dzieje się w środku, więc daj mi znać, jaka jest twoja aplikacja docelowa.

Scott Rhee
źródło
Zaktualizowałem moje pytanie, proszę spojrzeć na nie
neoDev,
Przekonałem się, że to działa lepiej: nircmd wygrywa zamknięty tytuł „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?

Odpowiedź na to pytanie można znaleźć here( link Microsoft ).

Możesz wysyłać WM_CLOSEwiadomości do dowolnego okna, które chcesz zamknąć. Wiele okien obsługuje WM_CLOSEmonit o zapisanie dokumentów przez użytkownika.

Narzędziem, które robi to poprawnie, jest @Kill. Zobacz także SendMsg .


Nie wiem jak to zrobić wsadowo, ale możesz do tego użyć vbscript. Symulowanie klawiszy Alt+ F4(równoznaczne z sygnałem WM_CLOSE).

Uruchom i spójrz na zachowanie tego skryptu poniżej.

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 to nazwy kluczy listy dla SendKeys.

Po uruchomieniu skryptu notatnik jest otwarty, niektóre słowa są zapisywane, a następnie dostarczany jest sygnał do zamknięcia programu, patrz rysunek poniżej.


Dodatkowe pytania

Czy mogę uruchomić program zminimalizowany lub tło z vbscript?

Tak. Użyj następującego kodu:

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

Aby uzyskać więcej informacji, sprawdź Run Method.

Czy chrome może przejść do jakiegoś adresu URL w vbscript?

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

Jeśli chrom jest domyślny, użyj:

set objShell = CreateObject("WScript.Shell")
objShell.run(iURL)

Source

Czy istnieje sposób na skoncentrowanie się na konkretnej aplikacji ( chrome.exe )?

Here w przykładzie.

Chcę wysłać alt + f4 TYLKO do chrome, niezależnie od tego, co robię z innymi oknami.

Poniższy kod działa w systemie 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
źródło
Czy mogę uruchomić program zminimalizowany lub tło z vbscript?
neoDev,
1
@Roger Jeśli jesteś zainteresowany, zobacz moją odpowiedź tutaj, jak połączyć Batch + JScript w jednym pliku. JScript potrafi zrobić wszystko, co potrafi VBScript w bardziej uporządkowanym stylu C.
David Ruhmann
i czy chrome może przejść do jakiegoś adresu URL w vbscript?
neoDev,
czy istnieje sposób na skoncentrowanie się na konkretnej aplikacji (chrome.exe)?
neoDev
Tak, próbuję z tym, ale jeśli po pewnym czasie (WScript.Sleep 5000) mam (WshShell.AppActivate „google chrome”), jeśli w tym okresie kliknę na inne okno, Google Chrome nie pojawi się na pierwszym planie , widzę, że skupia się tylko na pasku narzędzi ....
neoDev
3

Istnieją narzędzia wiersza polecenia, które mogą wysłać odpowiedni WM_SYSCOMMANDkomunikat (z SC_CLOSEpoleceniem) do okna najwyższego poziomu programu. Jestem pewien, że co najmniej jeden zostanie wymieniony wkrótce. (Wtedy ktoś wspomni AutoIt. Wtedy pojawi się odpowiedź pokazująca, jak to zrobić za pomocą PowerShell i CloseMainWindow().)

Nazywa się narzędzie wiersza polecenia, które jest wbudowanym poleceniem w TCC JP Software , interpretera poleceń i procesora skryptów poleceń dla systemu Windows TASKEND.

JdeBP
źródło
Zaktualizowałem moje pytanie, proszę spojrzeć na nie
neoDev,
2

W porządku, nie zamierzam kłamać. Widziałem to podczas stackoverflow i pomyślałem, że to trudne pytanie. Soooo Spędziłem ostatnie 2 godziny pisząc kod. A oto jest ...

Po wykonaniu poniższych kroków możesz wpisać „TaskClose notepad.exe” po naciśnięciu przycisku „Start”, co spowoduje automatyczne zapisanie wszystkich nieudokumentowanych plików notatnika na pulpicie. Automatycznie zamknie chrome.exe i zapisze ustawienia przywracania.

Możesz dodawać i usuwać dodatkowe ustawienia dla innych aplikacji pod warunkiem if. Na przykład:

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

Pliki vbs i wsadowe wykonują następujące procedury:

  • Zbiera plik wykonywalny.
  • Wykonuje kwerendę o nazwy aplikacji wykonywalnych poza listą zadań.
  • Wykonuje procedurę „Alt + TAB (x)”, dopóki nie sprawdzi, czy okno jest otwarte.
  • Następnie wykonuje polecenia kroczące, niezależnie od tego, czy jest to „Alt + F4”, a nawet w skrajnych przypadkach
  • Alt + F4
  • Aktywuj Zapisz
  • AutoIncrememnt Nazwa pliku
  • Wyjdź z aplikacji.

ReturnAppList.bat: zainstaluj w „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: zainstaluj w „C: \ windows \ system32 \” ORAZ „C: \ Users \ YourUserName \”

C:\windows\system32\wscript.exe c:\windows\system32\taskclose.vbs %1

TaskClose.vbs: zainstaluj w „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

Pisanie było świetną zabawą i cieszę się, że go ukończyłem, niż pokazałem odpowiedź. Miłego tygodnia!

Bogaty
źródło