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

Programme von der Befehlszeile aus schließen (Windows)

Wie kann man Programme von der Befehlszeile aus schließen/beenden, ähnlich wie beim Drücken der “X”-Schliessen-Schaltfläche in der Ecke des Fensters?

Ich versuche, Chrom unter 3 verschiedenen Versionen von Fenstern zu schließen: win7 ultimate, win7 home, winXP

Under Ultimate und XP: TSKILL chrome

Under Home: TASKKILL /IM chrome.exe

TSKILL chrome:

(Es schließt Chrom, keine cmd-Fehler, aber Chromfehler restore beim Neustart)

TASKKILL /IM chrome.exe:

(Es schließt Chrom, keine Chromfehler beim Neustart, aber Fehler in cmd: “Unmöglich, untergeordnete Prozesse zu beenden (ca. 4-5), nur mit Gewalt mit /F”)

Sollte ich cmd-Kindfehler ignorieren, wenn Chrom mir beim Neustart keine Fehler anzeigt?

Antworten (5)

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

Die richtige Art und Weise, ein Programm zu schließen/zu beenden, hängt letztlich von der Software ab. Im Allgemeinen ist es jedoch am besten, wenn Windows-Programme geschlossen werden, sobald sie die Meldung WM_CLOSE erhalten. Ordnungsgemäßes Freigeben von Speicher und Schließen von Handles. Es gibt andere Meldungen, die das Schließen der Anwendung signalisieren können, aber es ist Sache des Autors der Software, wie jede Meldung behandelt wird.

taskkill /IM process.exe

taskkill sendet die WM_CLOSE-Meldung, und es liegt dann an der Anwendung, ob sie ordnungsgemäß geschlossen werden soll. Sie können auch die Option /T verwenden, um auch untergeordnete Prozesse zu signalisieren.

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

Andere Optionen wären das Senden der Alt+F4-Tasten, die Verwendung von PowerShell oder Anwendungen von Drittanbietern.

Update auf aktualisierte Frage

Ignorieren, die Fehler. Chrome erzeugt viele Prozesse. Die Fehler werden verursacht, wenn ein Prozess die von TASKKILL gesendete WM_CLOSE-Nachricht nicht bestätigt. Nur Prozesse mit einer Meldungsschleife können die Meldung empfangen, daher erzeugen die Prozesse, die keine Meldungsschleife haben, diesen Fehler. Höchstwahrscheinlich handelt es sich bei diesen Prozessen um die Chrom-Erweiterungen und Plugins.

Um die Fehler zu verbergen, erfassen Sie die Ausgabe

taskkill /IM chrome.exe >nul

Zusammenfassung: TASKKILL ist der richtige Weg über die Befehlszeile, um Anwendungen per seiner WM_CLOSE-Implementierung und der Microsoft KB, die ich verlinkt habe zu schließen.

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

Versuchen Sie NirCmd (Download: x86 x64 )

Es verfügt über den Befehl “closeprocess”, mit dem Prozesse auf elegante Weise geschlossen werden können. Gemäß seinem Dokument beendet er Anwendungen nicht, sondern sendet WM_CLOSE an alle Fenster der obersten Ebene des Zielprozesses.

Verwendungsbeispiel:

nircmd closeprocess chrome.exe

Wenn das nicht funktioniert, hat Ihre Anwendung sicher ein ungewöhnliches Aufräumverfahren. Ich würde gerne sehen, was darin passiert, also lassen Sie mich bitte wissen, was Ihre Zielanwendung ist.

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?

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

Sie können `WMCLOSE_ Nachrichten an jedes Fenster senden, das Sie schließen möchten. Viele Fenster handhaben _WMCLOSE`, um den Benutzer zum Speichern von Dokumenten aufzufordern.

Ein Werkzeug, das dies korrekt tut, ist @Kill (Microsoft link). Schauen Sie sich auch SendMsg an.


Ich weiß nicht, wie man das im Batch macht, aber Sie könnten das vbscript dafür verwenden. Simulieren Sie die Tasten Alt + F4 (entspricht dem Signal `WMCLOSE`_).

Führen Sie es aus und schauen Sie sich das Verhalten dieses Skripts unten 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 Tastennamen für SendKeys.

Wenn Sie das Skript ausführen, ist das notepad geöffnet, einige Worte werden geschrieben und dann wird ein Signal zum Schließen des Programms ausgegeben, siehe Bild unten.

&00002


Zusätzliche Fragen

Kann ich ein Programm minimiert oder im Hintergrund mit vbscript? starten?

Ja. Verwenden Sie folgenden Code:

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

Weitere Informationen finden Sie unter Run Method .

Kann Chrom in vbscript?

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

Wenn Chrom 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 (chrome. exe)? Here in einem Beispiel.

Ich möchte alt+f4 NUR an Chrom senden, unabhängig davon, was ich mit anderen Fenstern mache.

Der folgende Code funktioniert auf 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

Es gibt einige Befehlszeilen-Dienstprogramme, die eine geeignete Nachricht WM_SYSCOMMAND (mit SC_CLOSE als Befehl) an das Fenster der obersten Ebene eines Programms senden können. Ich bin sicher, dass mindestens eines davon in Kürze erwähnt werden wird. (Dann wird jemand AutoIt erwähnen. )

Das Befehlszeilen-Dienstprogramm, das als integrierter Befehl in JP Software’s TCC , einem Befehlsinterpreter und Befehlsskriptprozessor für Windows, enthalten ist, heißt CloseMainWindow() .

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

In Ordnung, ich werde nicht lügen. Ich habe das bei Stackoverflow gesehen und dachte, das sei eine herausfordernde Frage. Sooooo habe ich gerade die letzten 2 Stunden damit verbracht, etwas Code zu schreiben. Und hier ist er….

Nachdem Sie die folgenden Schritte befolgt haben, können Sie “TaskClose notepad.exe” eingeben, nachdem Sie auf “Start” geklickt haben, und es wird automatisch alle undokumentierten Notizblockdateien auf dem Desktop speichern. Chrome.exe wird automatisch geschlossen und die Wiederherstellungseinstellungen werden gespeichert…

Sie können zusätzliche Einstellungen für andere Anwendungen unter den “Wenn”-Bedingungen 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

Das VBS und die Batch-Dateien führen die folgenden Prozeduren durch:

  • Sammelt die ausführbare Datei.
  • Fragt die Namen der ausführbaren Anwendungen aus der Taskliste ab.
  • Führt eine “Alt+TAB(x)”-Prozedur durch, bis es überprüft hat, dass das Fenster geöffnet ist.
  • Führt dann die rollenden Befehle aus, sei es “Alt+F4” oder sogar in Extremfällen
  • Alt+F4
  • Aktivieren Sie Speichern
  • Dateiname automatisch eintragen
  • Anwendung beenden.

ReturnAppList.bat : installieren in “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 : installieren in “C:\windows\system32\” UND “C:\Users\YourUserName\”

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

TaskClose.vbs : installieren in “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

Dies zu schreiben hat viel Spaß gemacht und ich freue mich mehr darüber, es zu beenden, als die Antwort tatsächlich zu zeigen. Ich wünsche Ihnen eine tolle Woche!