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

Chiudere i programmi dalla riga di comando (Windows)

Qual è il modo corretto per chiudere/uscire dai programmi dalla riga di comando, simile alla pressione del pulsante “X” di chiusura nell'angolo della finestra?

Im cercando di chiudere cromato sotto 3 diverse versioni di finestre: win7 ultimate, win7 home, winXP

Under Ultimate e XP: TSKILL chrome

Under Home: TASKKILL /IM chrome.exe

TSKILL chrome:

(Chiude cromatura, nessun errore di cromatura, ma errore di cromatura restore al rilancio)

TASKKILL /IM chrome.exe:

(Chiude cromatura, nessun errore di cromatura al rilancio, ma errori in cmd: “impossibile terminare i processi figli (circa 4-5), solo con la forza con /F”)

Devo ignorare gli errori figli in cmd se al rilancio cromo non mi mostrano errori?

Risposte (5)

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

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

taskkill /IM process.exe

taskkill invia il messaggio WM_CLOSE e spetta poi all'applicazione se chiudere correttamente. Si può anche utilizzare l'opzione /T per segnalare anche i processi figli.

Utilizzare l'opzione /F solo se si vuole forzare la chiusura del processo.

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

Aggiornamento alla domanda aggiornata

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

Per nascondere gli errori cattura l'uscita

taskkill /IM chrome.exe >nul

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

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

Provare NirCmd (Download: x86 x64 )

Ha il comando “closeprocess” che è progettato per chiudere i processi con grazia. Come da documento, non termina le applicazioni 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 vostra applicazione ha una procedura di pulizia insolita. Vorrei vedere cosa succede all'interno, quindi fatemi sapere qual è la vostra applicazione di destinazione.

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?

La risposta a questa domanda si trova here (Microsoft link).

È possibile inviare `WMCLOSE_ messaggi a qualsiasi finestra che si desidera chiudere. Molte finestre gestiscono _WMCLOSE` per chiedere all'utente di salvare i documenti.

Uno strumento che lo fa correttamente è @Kill . Guarda anche SendMsg .


Non so come fare questo in batch, ma si potrebbe usare il vbscript per questo. Simulare le chiavi Alt + F4 (equivale al segnale `WMCLOSE`_).

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 è la lista dei nomi delle chiavi per SendKeys.

Quando si esegue lo script, il notepad è aperto, vengono scritte alcune parole e poi viene inviato un segnale per chiudere il programma, vedi immagine sotto.


Domande aggiuntive

Posso avviare un programma minimizzato, o in background con vbscript?

Sì. Usare il seguente codice:

WshShell.Run "%windir%\notepad.exe", 2
``` ```
Dim iURL  
Dim objShell iURL = "www.google.com"
set objShell = CreateObject("Shell.Application") 
objShell.ShellExecute "chrome.exe", iURL, "", "", 1

Per ulteriori informazioni, controllare Run Method .

Può il cromo andare a qualche url in vbscript?

set objShell = CreateObject("WScript.Shell")
objShell.run(iURL)
``` ```
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}"

Se il cromo è l'impostazione predefinita, usare:

&001 &001 Source

C'è un modo per mettere a fuoco l'applicazione specifica (cromo. exe)? Here in un esempio.

Vorrei inviare alt+f4 SOLO al cromo, indipendentemente da quello che sto facendo con altre finestre.

Il seguente codice funziona su Windows 8.

&001

3
3
3
2014-03-11 21:18:50 +0000

Ci sono alcune utility a riga di comando che possono inviare un messaggio WM_SYSCOMMAND adatto (con SC_CLOSE come comando) alla finestra di primo livello di un programma. Sono sicuro che almeno uno sarà menzionato a breve. (Poi qualcuno menzionerà AutoIt. Poi ci sarà una risposta che mostrerà come farlo con PowerShell e CloseMainWindow().)

L'utilità a riga di comando che viene fornita come comando incorporato in JP Software’s TCC , un interprete di comandi e processore di script di comando per Windows, si chiama TASKEND .

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

Va bene, non voglio mentire. Ho visto questo su stackoverflow e ho pensato che fosse una domanda impegnativa. Soooo ho appena passato le ultime 2 ore a scrivere del codice. Ed eccolo qui…..

Dopo aver seguito la procedura qui sotto, puoi digitare “TaskClose notepad.exe” dopo aver premuto “Start” e salverà automaticamente tutti i file di notepad non documentati sul desktop. Chiuderà automaticamente chrome.exe e salverà le impostazioni del restauro.

È possibile aggiungere e rimuovere ulteriori impostazioni per altre applicazioni alle condizioni if. Ad 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
``` ```
for /f "tokens=10 delims=," %%F in ('tasklist /v /fi "imagename eq %1" /fo csv') do @echo %%~F >>result.txt

Il vbs e i file batch eseguono le seguenti procedure:

  • Raccoglie l'eseguibile.
  • Interroga i nomi delle applicazioni eseguibili dalla tasklist.
  • Esegue una procedura “Alt+TAB(x)” finché non ha verificato che la finestra sia aperta.
  • Esegue quindi i comandi a rotazione, sia che si tratti di “Alt+F4” o anche in casi estremi
  • Alt+F4
  • Attivare Save
  • AutoIncrememnt Filename
  • AutoIncrememnt Filename
  • Uscire dall'applicazione.

ReturnAppList.bat : installare in “C:\windows\system32\”

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

TaskClose.bat : installare in “C:\windows\system32\”. E “C:\ \Users\YourUserName\”

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
``` &001 

TaskClose.vbs : installare in "C:\windows\system32\" 


&001 &001 


Questo è stato molto divertente da scrivere e sono più contento di averlo finito che di aver mostrato la risposta. Buona settimana!