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

Zamykanie programów z linii poleceń (Windows)

Jaki jest właściwy sposób zamykania/wyłączania programów z linii poleceń, podobny do naciśnięcia przycisku “X” zamykania w rogu okna?

Im próbuje zamknąć chrom w 3 różnych wersjach okien: win7 ultimate, win7 home, winXP

Under Ultimate oraz XP: TSKILL chrome

Under Home: TASKKILL /IM chrome.exe

TSKILL chrome:

(Zamyka chrom, nie ma błędów cmd, ale błąd chromu przywróć przy ponownym uruchomieniu)

TASKKILL /IM chrome.exe:

(Zamyka chrom, nie ma błędów chrom przy ponownym uruchomieniu, ale błędy w cmd: “niemożliwe zakończenie procesów dziecięcych (około 4-5), tylko na siłę z /F”)

Czy powinienem zignorować błędy dziecięce w cmd, jeśli przy ponownym uruchomieniu Chrome nie pokaże mi żadnych błędów?

Odpowiedzi (5)

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

Właściwy sposób zamknięcia/wyjścia z programu zależy ostatecznie od oprogramowania. Generalnie jednak najlepszą praktyką jest zamykanie programów Windows, gdy tylko otrzymają 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 z nich jest obsługiwana.

taskkill /IM process.exe

taskkkill wysyła komunikat WM _CLOSE i to od aplikacji zależy, czy prawidłowo zamkniemy. Możesz również użyć opcji /T do sygnalizowania procesów potomnych.

Użyj opcji /F tylko wtedy, gdy chcesz wymusić zakończenie procesu.

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

Zaktualizuj zapytanie

Ignoruj, błędy. Chrome generuje wiele procesów. Błędy są powodowane, gdy proces nie potwierdza komunikatu WM_CLOSE wysyłanego przez TASKKILL. Tylko procesy z pętlą komunikatów będą w stanie odebrać komunikat, dlatego też procesy, które nie mają pętli komunikatów, wygenerują ten błąd. Najprawdopodobniej są to chromowane rozszerzenia i wtyczki.

Aby ukryć błędy, przechwytuj wyjście

taskkill /IM chrome.exe >nul

Summary: TASKKILL jest właściwym sposobem poprzez linię poleceń na zamknięcie aplikacji na jej implementacji WM_CLOSE i Microsoft KB, który połączyłem .

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

Spróbuj NirCmd (Pobierz: x86 x64 )

Posiada polecenie “closeprocess”, które jest przeznaczone do zamykania procesów z gracją. Zgodnie z jego dokumentem, nie kończy on aplikacji, ale wysyła WM_CLOSE do wszystkich okien najwyższego poziomu docelowego procesu.

Przykład użycia:

nircmd closeprocess chrome.exe

Jeśli to nie działa, założę się, że Twoja aplikacja ma nietypową procedurę czyszczenia. Chciałbym zobaczyć, co dzieje się wewnątrz, więc proszę dać mi znać, co jest twoją aplikacją docelową.

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?

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

Możesz wysłać wiadomość `WMCLOSE_ do dowolnego okna, które chcesz zamknąć. Wiele okien obsługuje _WMCLOSE` aby zachęcić użytkownika do zapisania dokumentów.

Narzędziem, które robi to poprawnie jest @Kill . Spójrz również SendMsg .

  • *

Nie wiem jak to zrobić w trybie wsadowym, ale możesz użyć do tego vbscript. Symulacja klawiszy Alt + F4 (równa się sygnałowi `WMCLOSE`_).

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 jest listą nazw klawiszy dla SendKeys.

Kiedy uruchamiasz skrypt, notepad jest otwarty, niektóre słowa są pisane, a następnie dostarczany jest sygnał do zamknięcia programu, patrz rysunek poniżej.

  • *

Pytania dodatkowe

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

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 chrome jest domyślny, użyj:

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

Source

Czy istnieje sposób na skupienie się na konkretnej aplikacji (chrome. exe)? Here w przykładzie.

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

Następujący kod działa na Oknach 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

Istnieje kilka narzędzi z linii poleceń, które mogą wysłać odpowiednią wiadomość WM_SYSCOMMAND (z SC_CLOSE jako polecenie) do okna programu z najwyższego poziomu. Jestem pewien, że przynajmniej jedna z nich zostanie wkrótce wspomniana. (Wtedy ktoś wspomni o AutoIt. Wtedy pojawi się odpowiedź pokazująca jak to zrobić z PowerShell'em i CloseMainWindow().)

Narzędzie linii poleceń, które jest wbudowane w JP Software’s TCC , interpreter komend i procesor skryptów komend dla Windows, nazywa się TASKEND .

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

Dobra, nie będę kłamać. Widziałem to na Stackoverflow i pomyślałem, że to trudne pytanie. Soooo, właśnie spędziłem ostatnie 2 godziny pisząc jakiś kod. I oto jest…

Po wykonaniu poniższych kroków, możesz wpisać “TaskClose notepad.exe” po naciśnięciu “Start” i automatycznie zapisze wszystkie nieudokumentowane pliki notatnika na pulpicie. Spowoduje to automatyczne zamknięcie chrome.exe i zapisanie ustawień przywracania.

Możesz dodawać i usuwać dodatkowe ustawienia dla innych aplikacji na określonych warunkach. 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:

  • Pobiera plik wykonywalny.
  • Wywołuje nazwy aplikacji wykonywalnych z listy zadań.
  • Wykonuje procedurę “Alt+TAB(x)” do momentu sprawdzenia, czy okno jest otwarte.
  • Następnie wykonuje polecenia kroczące, czy to “Alt+F4”, czy nawet w skrajnych przypadkach
  • Alt+F4
  • Aktywacja zapisu
  • Automatyczne usuwanie nazwy pliku
  • Wyjście 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\”. I “C:\NNNazwa użytkownika”

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

TaskClose.vbs : zainstaluj w “C:\NOknawach\NSystem32\N”

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

To było dużo zabawy do pisania i jestem bardziej zadowolony z zakończenia go, niż faktycznie pokazując odpowiedź. Miłego tygodnia!