Chiudi programmi dalla riga di comando (Windows)


46

Qual è il modo corretto di chiudere / chiudere i programmi dalla riga di comando, in modo simile alla pressione del pulsante di chiusura "X" nell'angolo della finestra?

Sto cercando di chiudere Chrome in 3 diverse versioni di Windows: win7 ultimate, win7 home, winXP

Sotto Ultimate e XP: TSKILL chrome

Sotto casa: TASKKILL /IM chrome.exe


TSKILL chrome:

(Chiude cromo, nessun errore di cmd,
ma errore di cromo ristabilire quando lo si riavvia)


TASKKILL /IM chrome.exe:

(Si chiude il cromo, non ci sono errori di cromo quando lo si riavvia,
ma errori in cmd: "impossibile terminare i processi figli (circa 4-5), solo con la forza con /F ")


Devo ignorare gli errori di cmd child se sul chrome di rilancio non mostro errori?


@MosheKatz: Puoi mostrarmi qualche esempio di codice di uscita, per favore? Mi piacerebbe sapere cosa succede quando premo il tasto X ..
neoDev

5
Taskkill invia il messaggio WM_CLOSE al programma di destinazione a meno che non sia specificato / F (terminazione forzata), per consentire al programma di avere la possibilità di ripulire se stesso. Prova questo con Blocco note - apri un blocco note e digita qualcosa lì, quindi digita "taskkill / im notepad.exe". Verrà visualizzato un prompt per salvare i dati.
Scott Rhee

@ScottRhee: ho già provato a eseguirlo senza / F, ma sembra essere una chiusura impropria ... Mi sbaglio?
neoDev

@ScottRhee: sto provando anche con Chrome! A volte, quando rilancio, dice "ripristina schede" in una linea gialla sotto l'URL simile a questo: backroom.bostonproductions.com/wp-content/uploads/2012/07/...
neoDev

@Roger Questo è strano in quanto non ottengo quel messaggio con Taskkill / IM chrome.exe. Ad ogni modo, credo che tu abbia fatto la cosa giusta. Ho scritto una risposta qui sotto, quindi per favore provalo.
Scott Rhee

Risposte:


40

Il modo corretto per chiudere / uscire da un programma dipende in ultima analisi dal software. Tuttavia, in genere la procedura migliore è che i programmi Windows vengano chiusi ogni volta che ricevono il messaggio WM_CLOSE. Rilasciare correttamente memoria e maniglie di chiusura. Ci sono altri messaggi che possono segnalare la chiusura dell'applicazione, ma spetta all'autore del software come viene gestito ogni messaggio.

taskkill /IM process.exe

taskkill invia il messaggio WM_CLOSE e spetta all'applicazione chiudersi correttamente. Potresti anche voler usare il /T opzione per segnalare anche i processi figli.

Usa solo il /F opzione se si desidera forzare la conclusione del processo.

Altre opzioni includono l'invio dei tasti Alt + F4, l'uso di PowerShell o applicazioni di terze parti.

Aggiornamento alla domanda aggiornata

Ignora, gli errori. Chrome genera molti processi. Gli errori sono causati quando un processo non riconosce il messaggio WM_CLOSE inviato da TASKKILL. Solo i processi con un loop di messaggi saranno in grado di ricevere il messaggio, quindi i processi che non hanno un loop di messaggi genereranno quell'errore. Molto probabilmente, questi processi sono le estensioni e i plugin di Chrome.

Per nascondere gli errori catturare l'output

taskkill /IM chrome.exe >nul

Sommario: TASKKILL è il modo corretto tramite la riga di comando per chiudere le applicazioni per la sua implementazione WM_CLOSE e il Microsoft KB che ho collegato .


Ho aggiornato la mia domanda, per favore dai un'occhiata
neoDev

@ Roger ha aggiornato la mia risposta.
David Ruhmann

cosa significa & gt; nul?
neoDev

10
> è l'operatore di reindirizzamento per il cmd.exe e nul è il vuoto dello spazio in cui le cose vanno a non essere mai più ascoltate.
David Ruhmann

5

Provare NirCmd (Scaricare: X 86 x64 )

Ha un comando "closeprocess" che è progettato per chiudere i processi con garbo. Secondo il suo documento, non termina le app ma invia WM_CLOSE a tutte le finestre di primo livello del processo di destinazione.

esempio di utilizzo:

nircmd closeprocess chrome.exe

Se questo non funziona, scommetto che la tua applicazione ha una procedura di pulizia insolita. Mi piacerebbe vedere cosa succede all'interno quindi per favore fatemi sapere qual è la vostra applicazione di destinazione.


Ho aggiornato la mia domanda, per favore dai un'occhiata
neoDev

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?

La risposta a questa domanda può essere trovata here ( Collegamento Microsoft ).

Tu puoi mandare WM_CLOSE messaggi a qualsiasi finestra che si desidera chiudere. Molte finestre gestiscono WM_CLOSE per richiedere all'utente di salvare i documenti.

Uno strumento che esegue correttamente questo è @Kill. Guarda anche SendMsg .


Non so come farlo in batch, ma potresti usare vbscript per questo. Simulare il alt + F4 tasti (equivale a segnalare WM_CLOSE ).

Esegui e guarda il comportamento di questo script qui sotto.

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 è il nome della chiave di elenco per SendKeys.

Quando esegui lo script, il bloc notes è aperto, alcune parole sono scritte e quindi viene inviato un segnale per chiudere il programma, vedere la figura sotto.


Domande aggiuntive

Posso avviare un programma ridotto a icona o sfondo con vbscript?

Sì. Usa il seguente codice:

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

Per maggiori informazioni controlla il Run Method.

Chrome può andare in qualche URL in VBScript?

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

Se Chrome è l'impostazione predefinita, utilizzare:

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

Source

C'è un modo per focalizzare l'attenzione su un'applicazione specifica ( chrome.exe )?

Here in un esempio.

Voglio inviare alt + f4 SOLO a chrome, indipendentemente da come faccio con altre finestre.

Il seguente codice funziona 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}"

Posso avviare un programma ridotto a icona o sfondo con vbscript?
neoDev

1
@ Roger Se interessato, vedi la mia risposta qui su come combinare Batch + JScript in un singolo file. JScript può fare tutto ciò che VBScript può fare e in uno stile C più strutturato.
David Ruhmann

e può cromo andare in qualche URL in VBScript?
neoDev

c'è un modo per focalizzare l'attenzione su un'applicazione specifica (chrome.exe)?
neoDev

Sì, ci sto provando, ma se dopo qualche ritardo (WScript.Sleep 5000) ho (WshShell.AppActivate "google chrome"), se durante questo periodo clicco su qualche altra finestra, google chrome non viene in primo piano , posso vedere il suo focus solo sulla barra degli strumenti ....
neoDev

3

Esistono alcune utilità della riga di comando che possono inviare un messaggio adatto WM_SYSCOMMAND messaggio (con SC_CLOSE come il comando) alla finestra di livello superiore di un programma. Sono sicuro che almeno uno sarà menzionato a breve. (Poi qualcuno menzionerà AutoIt. Poi ci sarà una risposta che mostra come farlo con PowerShell e CloseMainWindow().)

L'utilità della riga di comando fornita come comando incorporato TCC di JP Software , viene chiamato un interprete di comandi e un processore di script di comando per Windows TASKEND.


Ho aggiornato la mia domanda, per favore dai un'occhiata
neoDev

2

Bene, non mentirò. L'ho visto su StackOverflow e ho pensato che fosse una domanda stimolante. Soooo ho appena passato le ultime 2 ore a scrivere un codice. Ed ecco qui ....

Dopo aver seguito i passaggi seguenti, puoi digitare "TaskClose notepad.exe" dopo aver premuto "Start" e salverà automaticamente tutti i file notepad non documentati sul desktop. Chiude automaticamente chrome.exe e salva le impostazioni di ripristino.

È possibile aggiungere e rimuovere impostazioni aggiuntive per altre applicazioni nelle condizioni if. Per esempio:

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

I file vbs e batch eseguono le seguenti procedure:

  • Raccoglie l'eseguibile.
  • Interroga i nomi dell'applicazione eseguibile della lista di attività.
  • Esegue una procedura "Alt + TAB (x)" finché non lo ha verificato che la finestra è aperta.
  • Quindi esegue i comandi rotanti sia che si tratti di "Alt + F4" o anche in casi estremi
  • Alt + F4
  • Attiva Salva
  • Nome file AutoIncrememnt
  • Esci dall'applicazione.

ReturnAppList.bat: installa 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: installa in "C: \ windows \ system32 \" AND "C: \ Users \ YourUserName \"

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

TaskClose.vbs: installa 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

Questo è stato molto divertente da scrivere e sono più felice di averlo finito che di mostrare effettivamente la risposta. Buona settimana!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.