it-swarm.com.de

Programme über die Befehlszeile schließen (Windows)

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 Home: TASKKILL /IM chrome.exe


TSKILL chrome:

(Es schließt Chrom, keine cmd-Fehler,
aber Chrome-Fehler Wiederherstellen beim Neustart)


TASKKILL /IM chrome.exe:

(Es schließt Chrome, keine Chrome-Fehler beim Neustart,
aber Fehler in cmd: "Untergeordnete Prozesse können nicht beendet werden (ca. 4-5), nur mit /F erzwungen")


Soll ich cmd child-Fehler ignorieren, wenn beim Neustart von Chrome keine Fehler angezeigt werden?

47
neoDev

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 liegt beim Autor 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 Option /T verwenden, um auch untergeordnete Prozesse zu signalisieren.

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

Zu den weiteren Optionen gehört das Senden der Alt + F4-Tasten mit 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 der richtige Weg über die Befehlszeile, um Anwendungen gemäß der WM_CLOSE-Implementierung und dem Microsoft KB, das ich verknüpft habe zu schließen.

40
David Ruhmann

Versuchen Sie NirCmd (Download: x86x64 )

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

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.

5
Scott Rhee
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 unter here ( Microsoft-Link ).

Sie können WM_CLOSE Nachrichten an jedes Fenster senden, das Sie schließen möchten. In vielen Fenstern wird WM_CLOSE verwendet, um den Benutzer zum Speichern von Dokumenten aufzufordern.

Ein Tool, das dies korrekt ausführt, ist @Kill . Schauen Sie auch SendMsg .


Ich weiß nicht, wie man das im Batch macht, aber Sie könnten das vbscript dafür verwenden. Simulation der Alt + F4 Tasten (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 der Listenname für SendKeys.

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


Zusätzliche 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 unter 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}"
4
stderr

Es gibt einige Befehlszeilenprogramme, die eine geeignete WM_SYSCOMMAND -Nachricht (mit SC_CLOSE als Befehl) an das Hauptfenster eines Programms senden können. Ich bin mir sicher, dass in Kürze mindestens einer erwähnt wird. (Dann wird jemand AutoIt erwähnen. Dann wird eine Antwort angezeigt, wie es mit PowerShell und CloseMainWindow() gemacht wird.)

Das Befehlszeilendienstprogramm, das als integrierter Befehl in JP Software's TCC , einem Befehlsinterpreter und Befehlsskriptprozessor für Windows, enthalten ist, heißt TASKEND .

3
JdeBP

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. Chrome.exe wird automatisch geschlossen und die Wiederherstellungseinstellungen werden gespeichert.

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!

2
Rich