Feche os programas na linha de comando (Windows)

49

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

Estou tentando fechar o chrome em 3 versões diferentes do windows: win7 ultimate, win7 home, winXP

Sob Ultimate e XP: TSKILL chrome

Em Casa TASKKILL /IM chrome.exe


TSKILL chrome::

(Ele fecha o chrome, sem erros de cmd,
mas a restauração de erros do chrome ao reiniciá-lo)


TASKKILL /IM chrome.exe:

(Ele fecha cromo, sem erros cromo quando relançá-lo,
mas erros no cmd: "impossíveis de encerrar processos filhos (cerca de 4-5) apenas pelo vigor com /F")


I deve ignorar os erros criança cmd se no relançamento cromo me mostrar sem erros ?

neoDev
fonte
@ MosheKatz: Você pode me mostrar algum exemplo de código de saída, por favor? Gostaria de saber o que acontece quando eu apertar o botão X ..
NeoDev
6
Taskkill envia a mensagem WM_CLOSE para o programa de destino, a menos que seja especificado / F (encerramento forçado), para permitir que o programa tenha chances de se limpar. Teste isso com o Bloco de notas - abra um bloco de notas e digite algo lá e digite "taskkill / im notepad.exe". Você verá uma solicitação para salvar os dados.
21814 Scott Rhee #
@ ScottRhee: Eu já tentei executá-lo sem / F, mas parece ser um fechamento inadequado ... Estou errado?
NeoDev 11/03/2014
@ ScottRhee: Estou tentando com o Chrome também! Às vezes, quando eu relançamos, ele diz "restaurar guias" em uma linha amarela na URL semelhante a esta: backroom.bostonproductions.com/wp-content/uploads/2012/07/…
neoDev
@ Roger Isso é estranho, porque eu não recebo essa mensagem com Taskkill / IM chrome.exe. Enfim, acredito que você fez a coisa certa. Eu escrevi uma resposta abaixo, então tente isso.
Scott Rhee

Respostas:

43

A maneira correta de fechar / sair de um programa depende, em última análise, do software. No entanto, geralmente a melhor prática é fechar os programas do Windows sempre que receberem 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

O taskkill envia a mensagem WM_CLOSE e cabe ao aplicativo fechar corretamente. Você também pode usar a /Topção para sinalizar também processos filhos.

Use a /Fopção apenas se desejar forçar o término do processo.

Outras opções incluem o envio das teclas Alt + F4, usando o PowerShell ou aplicativos de terceiros.

Atualizar para a pergunta atualizada

Ignore, os erros. O Chrome gera muitos processos. Os erros são causados ​​quando um processo não reconhece a mensagem WM_CLOSE que 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. Muito 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: TASKKILL é a maneira correta, via linha de comando, de fechar aplicativos de acordo com sua implementação WM_CLOSE e o KB da Microsoft que vinculei .

David Ruhmann
fonte
Atualizei minha pergunta, por favor, dê uma olhada nela #
neoDev
@Roger atualizou minha resposta.
David Ruhmann 11/03/14
o que significa> nul?
NeoDev 11/03/2014
10
>é o operador de redirecionamento do cmd.exe e nulé o espaço vazio onde as coisas nunca mais serão ouvidas.
David Ruhmann 11/03/14
9

Experimente o NirCmd (Download: x86 x64 )

Possui o comando "closeprocess", que é projetado para fechar processos normalmente. Conforme seu documento, ele não encerra os aplicativos, mas envia WM_CLOSEpara 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. Gostaria de ver o que acontece lá dentro, por favor, deixe-me saber qual é o seu aplicativo de destino.

Scott Rhee
fonte
Atualizei minha pergunta, por favor, dê uma olhada nela #
neoDev
Eu achei que isso funcionava melhor: nircmd win close title "Meu processo de título"
user1495323 23/08
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( link da Microsoft ).

Você pode enviar WM_CLOSEmensagens para qualquer janela que deseja fechar. Muitas janelas são manipuladas WM_CLOSEpara solicitar que o usuário salve documentos.

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


Não sei como fazer isso em lote, mas você pode usar o vbscript para isso. Simular as teclas Alt+ F4(equivale a sinalizar WM_CLOSE).

Execute 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 são os nomes das chaves da lista para as SendKeys.

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


Questões adicionais

Posso iniciar um programa minimizado ou em segundo plano com vbscript?

Sim. Use o seguinte código:

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

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

O chrome pode acessar algum URL no vbscript?

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

Se o chrome for o padrão, use:

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

Source

Existe uma maneira de focar em aplicativos específicos ( chrome.exe )?

Here em um exemplo

Quero enviar alt + f4 SOMENTE 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}"
stderr
fonte
Posso iniciar um programa minimizado ou em segundo plano com vbscript?
NeoDev 11/03/2014
1
@ Roger Se estiver interessado, veja minha resposta aqui sobre como combinar Batch + JScript em um único arquivo. O JScript pode fazer quase tudo o que o VBScript pode fazer e em um estilo C. mais estruturado.
David Ruhmann
e o chrome pode ir para algum URL no vbscript?
NeoDev 11/03/2014
existe uma maneira de focar em aplicativos específicos (chrome.exe)?
NeoDev 12/03/2014
Sim, estou tentando, mas se, após algum atraso (WScript.Sleep 5000), tiver (WshShell.AppActivate "google chrome"), se durante esse período clicar em alguma outra janela, o google chrome não chegará à frente , eu posso ver o seu foco apenas na barra de ferramentas ....
NeoDev
3

Existem alguns utilitários de linha de comando que podem enviar uma WM_SYSCOMMANDmensagem adequada (com SC_CLOSEo 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á o AutoIt. Em seguida, 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 scripts de comandos para Windows, é chamado TASKEND.

JdeBP
fonte
Atualizei minha pergunta, por favor, dê uma olhada nela #
neoDev
2

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

Após seguir as etapas abaixo, você pode digitar "TaskClose notepad.exe" após pressionar "Iniciar" e ele salvará automaticamente todos os arquivos de bloco de notas não documentados na área de trabalho. Ele fecha automaticamente o chrome.exe e salva 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 ​​fora da lista de tarefas.
  • Executa um procedimento "Alt + TAB (x)" até verificar se a janela está aberta.
  • Em seguida, executa os comandos de rolagem, seja "Alt + F4" ou mesmo em casos extremos
  • Alt + F4
  • Ativar Salvar
  • Nome do arquivo AutoIncrememnt
  • Sair da aplicação.

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 \" AND "C: \ Users \ YourUserName \"

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

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

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

Rico
fonte