Programme über die Befehlszeile schließen (Windows)

49

Was ist der richtige Weg, um Programme von der Kommandozeile aus zu schließen / zu beenden, ähnlich wie das Drücken der "X" -Schließtaste in der Fensterecke?

Ich versuche Chrome unter 3 verschiedenen Windows-Versionen zu schließen: win7 ultimate, win7 home, winXP

Unter Ultimate und XP: TSKILL chrome

Unter Zuhause TASKKILL /IM chrome.exe


TSKILL chrome:

(Chrome wird geschlossen, keine cmd-Fehler,
aber Chrome-Fehler werden beim Neustart wiederhergestellt )


TASKKILL /IM chrome.exe:

(Es schließt Chrome, keine Chrome-Fehler beim Neustart,
aber Fehler in Cmd: "Unmöglich, untergeordnete Prozesse zu beenden (ca. 4-5), nur mit Kraft /F")


Sollte ich untergeordnete Cmd-Fehler ignorieren, wenn beim Neustart von Chrome keine Fehler angezeigt werden ?

neoDev
quelle
@ MosheKatz: Können Sie mir bitte ein Beispiel für einen Exit-Code zeigen? Ich würde gerne wissen, was passiert, wenn ich die X-Taste
drücke
6
Taskkill sendet eine WM_CLOSE-Nachricht an das Zielprogramm, sofern nicht / F (erzwungene Beendigung) angegeben ist, damit das Programm die Möglichkeit hat, sich selbst zu bereinigen. Teste dies mit Notepad - öffne einen Notepad und tippe dort etwas ein und gib "taskkill / im notepad.exe" ein. Sie werden aufgefordert, die Daten zu speichern.
Scott Rhee
@ScottRhee: Ich habe bereits versucht, es ohne / F zu starten, aber es scheint ein unpassender Abschluss zu sein ... irre ich mich?
neoDev
@ ScottRhee: Ich versuche es auch mit Chrome! Manchmal, wenn ich neu
starte, wird
@ Roger Das ist seltsam, da ich diese Meldung mit Taskkill / IM chrome.exe nicht bekomme. Wie auch immer, ich glaube du hast das Richtige getan. Ich habe unten eine Antwort geschrieben. Bitte versuchen Sie es stattdessen.
Scott Rhee

Antworten:

43

Die richtige Art, ein Programm zu schließen / zu beenden, hängt letztendlich von der Software ab. Im Allgemeinen empfiehlt es sich jedoch, Windows-Programme zu schließen, wenn sie die Meldung WM_CLOSE erhalten. Speicher ordnungsgemäß freigeben und Griffe schließen. Es gibt andere Nachrichten, die das Schließen der Anwendung signalisieren können, aber es ist Sache des Autors der Software, wie mit jeder Nachricht umgegangen wird.

taskkill /IM process.exe

taskkill sendet die WM_CLOSE-Nachricht und es liegt dann an der Anwendung, ob sie ordnungsgemäß geschlossen werden soll. Möglicherweise möchten Sie auch die /TOption verwenden, um auch untergeordnete Prozesse zu signalisieren.

Verwenden /FSie diese Option nur, wenn Sie die Beendigung des Vorgangs erzwingen möchten.

Zu den weiteren Optionen gehört das Senden der Alt + F4-Tasten mithilfe von PowerShell oder Anwendungen von Drittanbietern.

Update auf aktualisierte Frage

Ignoriere die Fehler. Chrome generiert viele Prozesse. Die Fehler werden verursacht, wenn ein Prozess die von TASKKILL gesendete WM_CLOSE-Nachricht nicht bestätigt. Nur Prozesse mit einer Nachrichtenschleife können die Nachricht empfangen. Daher wird dieser Fehler von den Prozessen generiert, die keine Nachrichtenschleife haben. Höchstwahrscheinlich handelt es sich bei diesen Prozessen um Chrome-Erweiterungen und -Plugins.

Um die Fehler auszublenden, erfassen Sie die Ausgabe

taskkill /IM chrome.exe >nul

Zusammenfassung: TASKKILL ist die richtige Methode zum Schließen von Anwendungen über die Befehlszeile gemäß der WM_CLOSE-Implementierung und der von mir verknüpften Microsoft-KB .

David Ruhmann
quelle
Ich habe meine Frage aktualisiert, bitte schauen Sie sie sich an
neoDev
@ Roger hat meine Antwort aktualisiert.
David Ruhmann
was bedeutet das> nul
neoDev
10
>ist der Redirect-Operator für die cmd.exe und nuldie Leere, in der Dinge nie wieder gehört werden.
David Ruhmann
9

Versuchen NirCmd (Download: x86 x64 )

Es verfügt über den Befehl "closeprocess", mit dem Prozesse ordnungsgemäß geschlossen werden können. Gemäß seinem Dokument werden Apps nicht beendet, sondern WM_CLOSEan alle Fenster der obersten Ebene des Zielprozesses gesendet.

Anwendungsbeispiel:

nircmd closeprocess chrome.exe

Wenn dies nicht funktioniert, hat Ihre Anwendung eine ungewöhnliche Bereinigungsprozedur. Ich würde gerne sehen, was im Inneren passiert. Bitte teilen Sie mir Ihre Zielanwendung mit.

Scott Rhee
quelle
Ich habe meine Frage aktualisiert, bitte schauen Sie sie sich an
neoDev
Ich fand das besser: nircmd win close title "Mein Prozesstitel"
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?

Die Antwort auf diese Frage finden Sie here( Microsoft-Link ).

Sie können WM_CLOSENachrichten an jedes Fenster senden , das Sie schließen möchten. In vielen Fenstern wird WM_CLOSEder Benutzer aufgefordert, Dokumente zu speichern.

Ein Werkzeug, das dies richtig macht, ist @Kill. Siehe auch SendMsg .


Ich weiß nicht, wie man das im Batch macht, aber Sie könnten das vbscript dafür verwenden. Simulieren der Alt+ F4Tasten (entspricht Signal WM_CLOSE).

Führen Sie das folgende Skript aus und sehen Sie sich dessen Verhalten an.

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 ist die Liste der Schlüsselnamen für SendKeys.

Wenn Sie das Skript ausführen, ist der Editor geöffnet, einige Wörter werden geschrieben und anschließend wird ein Signal zum Schließen des Programms ausgegeben (siehe Abbildung unten).


Weitere Fragen

Kann ich ein minimiertes Programm oder einen Hintergrund mit vbscript starten?

Ja. Verwenden Sie den folgenden Code:

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

Weitere Informationen finden Sie im Run Method.

Kann Chrome eine URL in VBScript aufrufen?

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

Wenn Chrome die Standardeinstellung ist, verwenden Sie:

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

Source

Gibt es eine Möglichkeit, den Fokus auf eine bestimmte Anwendung zu richten ( chrome.exe )?

Here in einem Beispiel.

Ich möchte ALT + F4 NUR an Chrome senden, unabhängig davon, ob ich mit anderen Fenstern arbeite.

Der folgende Code funktioniert unter 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
quelle
Kann ich ein minimiertes Programm oder einen Hintergrund mit vbscript starten?
neoDev
1
@ Roger Bei Interesse finden Sie hier meine Antwort, wie Sie Batch + JScript in einer einzigen Datei kombinieren können. JScript kann fast alles, was VBScript kann, und das in einem strukturierten C-Stil.
David Ruhmann
und kann Chrome zu einer URL in VBScript gehen?
neoDev
Gibt es eine Möglichkeit, den Fokus auf eine bestimmte Anwendung zu richten (chrome.exe)?
NeoDev
Ja, ich versuche es damit, aber wenn ich nach einiger Verzögerung (WScript.Sleep 5000) (WshShell.AppActivate "google chrome") habe, wenn ich in diesem Zeitraum auf ein anderes Fenster klicke, kommt Google Chrome nicht in den Vordergrund Ich kann seinen Fokus nur auf der Symbolleiste sehen ....
NeoDev
3

Es gibt einige Befehlszeilendienstprogramme, die eine geeignete WM_SYSCOMMANDNachricht (mit SC_CLOSEals Befehl) an das Fenster der obersten Ebene eines Programms senden können . Ich bin sicher, dass in Kürze mindestens einer erwähnt wird. (Dann wird AutoIt von jemandem erwähnt. Dann wird eine Antwort angezeigt, wie es mit PowerShell und ausgeführt wird CloseMainWindow().)

Das Befehlszeilendienstprogramm, das als integrierter Befehl im TCC von JP Software , einem Befehlsinterpreter und Befehlsskriptprozessor für Windows, enthalten ist, wird aufgerufen TASKEND.

JdeBP
quelle
Ich habe meine Frage aktualisiert, bitte schauen Sie sie sich an
neoDev
2

Okay, ich werde nicht lügen. Ich habe dies beim Stackoverflow gesehen und dachte, es sei eine herausfordernde Frage. Soooo, ich habe gerade die letzten 2 Stunden damit verbracht, Code zu schreiben. Und hier ist es ....

Nachdem Sie die folgenden Schritte ausgeführt haben, können Sie "TaskClose notepad.exe" eingeben, nachdem Sie auf "Start" geklickt haben. Alle undokumentierten Notepad-Dateien werden automatisch auf dem Desktop gespeichert. Es wird chrome.exe automatisch schließen und die Wiederherstellungseinstellungen speichern.

Sie können unter den Bedingungen if zusätzliche Einstellungen für andere Anwendungen hinzufügen und entfernen. Zum Beispiel:

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

Die vbs- und Batchdateien führen die folgenden Prozeduren aus:

  • Sammelt die ausführbare Datei.
  • Fragt die Namen der ausführbaren Anwendungen in der Jobliste ab.
  • Führt eine "Alt + TAB (x)" - Prozedur durch, bis überprüft wurde, ob das Fenster geöffnet ist.
  • Führt dann die Rollbefehle aus, egal ob "Alt + F4" oder auch im Extremfall
  • Alt + F4
  • Aktivieren Sie Speichern
  • AutoIncrememnt Filename
  • Anwendung verlassen.

ReturnAppList.bat: Installation unter "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: Installation unter "C: \ windows \ system32 \" UND "C: \ Users \ YourUserName \"

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

TaskClose.vbs: Installation unter "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

Es hat viel Spaß gemacht, darüber zu schreiben, und ich freue mich mehr, es zu beenden, als die Antwort tatsächlich zu zeigen. Hab eine großartige Woche!

Reich
quelle