Fechar programas da linha de comando (Windows)

45

Qual é a maneira correta de fechar / sair de programas a partir da linha de comando, similar a pressionar o botão "X" no canto da janela?

Estou tentando fechar o Chrome em três versões diferentes do Windows: Win7 Ultimate, Win7 Home, WinXP

Em Ultimate e XP: TSKILL chrome

Em casa: TASKKILL /IM chrome.exe


TSKILL chrome :

(fecha chrome, sem erros de cmd,
mas erro de cromo restaure ao relançá-lo)


TASKKILL /IM chrome.exe :

(fecha o chrome, não há erros de cromo ao relançá-lo,
mas erros em cmd: "impossível terminar processos filho (cerca de 4-5), apenas pela força com /F ")


Devo ignorar os erros-filhos do cmd se, no relançamento, o cromo não mostrar erros?

    
por neoDev 11.03.2014 / 21:25

5 respostas

39

A maneira correta de fechar / sair de um programa depende do software. No entanto, geralmente a melhor prática é para programas do Windows fechar sempre que receber a mensagem WM_CLOSE. Liberando corretamente a memória e fechando alças. Existem outras mensagens que podem sinalizar o fechamento do aplicativo, mas cabe ao autor do software como cada mensagem é tratada.

taskkill /IM process.exe
taskkill

envia a mensagem WM_CLOSE e é então até o aplicativo se deve fechar corretamente. Você também pode querer usar a opção /T para também sinalizar processos filhos.

Use somente a opção /F se quiser forçar o encerramento do processo.

Outras opções incluem enviar as teclas Alt + F4, usar o PowerShell ou aplicativos de terceiros.

Atualizar para uma pergunta atualizada

Ignore os erros. O Chrome gera muitos processos. Os erros são causados quando um processo não confirma a mensagem WM_CLOSE que o TASKKILL envia. Somente processos com um loop de mensagem poderão receber a mensagem, portanto, os processos que não possuem um loop de mensagem gerarão esse erro. Provavelmente, esses processos são extensões e plugins do Chrome.

Para ocultar os erros, capture a saída

taskkill /IM chrome.exe >nul

Resumo: O TASKKILL é o caminho adequado via linha de comando para fechar os aplicativos de acordo com sua implementação WM_CLOSE e o Microsoft KB que eu vinculei .

    
por 11.03.2014 / 22:51
5

Experimente NirCmd (Download: x86 x64 )

Ele possui o comando "closeprocess", que é projetado para fechar os processos normalmente. De acordo com o documento, ele não finaliza os aplicativos, mas envia WM_CLOSE para todas as janelas de nível superior do processo de destino.

exemplo de uso:

nircmd closeprocess chrome.exe

Se isso não funcionar, aposto que seu aplicativo tem um procedimento de limpeza incomum. Eu gostaria de ver o que acontece dentro, então, por favor, deixe-me saber qual é o seu aplicativo alvo.

    
por 11.03.2014 / 22:21
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?

A resposta para essa pergunta pode ser encontrada here ( Microsoft link ).

Você pode enviar mensagens WM_CLOSE para qualquer janela que deseja fechar. Muitas janelas manipulam WM_CLOSE para solicitar que o usuário salve documentos.

Uma ferramenta que faz isso corretamente é @Kill . Veja também SendMsg .

Eu não sei como fazer isso em lote, mas você pode usar o vbscript para isso. Simulando as teclas Alt + F4 (equivale ao sinal WM_CLOSE ).

Corra e observe o comportamento deste script abaixo.

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 é o nome da lista de chaves para SendKeys.

Quando você executa o script, o bloco de notas está aberto, algumas palavras são escritas e um sinal para fechar o programa é entregue, veja a imagem abaixo.

Perguntasadicionais

Possoiniciarumprogramaminimizadoouemsegundoplanocomvbscript?

Sim.Useoseguintecódigo:

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

Para mais informações, consulte as Run Method .

O Chrome pode ir para algum URL em vbscript?

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

Se chrome for o padrão, use:

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

Source

Existe uma maneira de direcionar o foco para um aplicativo específico ( chrome.exe )?

Here em um exemplo.

Quero enviar o ALTER + S4 APENAS para o Chrome, independentemente do que estou fazendo com outras janelas.

O código a seguir funciona no 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}"
    
por 12.03.2014 / 00:22
3

Existem alguns utilitários de linha de comando que podem enviar um WM_SYSCOMMAND (com SC_CLOSE como o comando) para a janela de nível superior de um programa. Tenho certeza de que pelo menos um será mencionado em breve. (Então alguém mencionará AutoIt. Então, haverá uma resposta mostrando como fazer isso com o PowerShell e CloseMainWindow() .)

O utilitário de linha de comando que vem como um comando interno no TCC da JP Software , um interpretador de comandos e processador de script de comando para Windows, chamado TASKEND .

    
por 11.03.2014 / 22:18
2

Tudo bem, não vou mentir. Eu vi isso no stackoverflow e pensei que era uma questão desafiadora. Soooo eu passei as últimas 2 horas escrevendo algum código. E aqui está ....

Depois de seguir as etapas abaixo, você pode digitar "TaskClose notepad.exe" após pressionar "Iniciar" e ele salvará automaticamente todos os arquivos do bloco de notas não documentados na área de trabalho. Ele fechará automaticamente o chrome.exe e salvará as configurações de restauração.

Você pode adicionar e remover configurações adicionais para outros aplicativos nas condições if. Por exemplo:

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

Os arquivos vbs e batch executam os seguintes procedimentos:

  • Coleta o executável.
  • Consulta os nomes dos aplicativos executáveis da lista de tarefas.
  • Executa um procedimento "Alt + TAB (x)" até que tenha verificada a janela está aberta.
  • Em seguida, executa os comandos de rolagem, seja "Alt + F4" ou até mesmo em casos extremos
  • Alt + F4
  • Ativar Salvar
  • Nome do arquivo do AutoIncrememnt
  • Sair do aplicativo.

ReturnAppList.bat: instale em "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: instale em "C: \ windows \ system32 \" E "C: \ Users \ YourUserName \"

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

TaskClose.vbs: instale em "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

Isso foi muito divertido de escrever e estou mais feliz em terminá-lo do que realmente mostrar a resposta. Tenham uma ótima semana!

    
por 12.03.2014 / 02:37