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

Fechar programas a partir da linha de comando (Windows)

Qual é a forma adequada de fechar/sair programas a partir da linha de comando, semelhante a premir o botão “X” fechar no canto da janela?

Estou a tentar fechar o cromado sob 3 versões diferentes de janelas: win7 ultimate, win7 home, winXP

Under Ultimate e XP: TSKILL chrome

Under Home: TASKKILL /IM chrome.exe

TSKILL chrome:

(Fecha o cromo, sem erros em cmd, mas erro em cmd restaura quando o relança)

TASKKILL /IM chrome.exe:

(Fecha o cromo, sem erros em cmd quando o relança, mas erros em cmd: “impossível terminar processos infantis (cerca de 4-5), apenas à força com /F”)

Devo ignorar os erros infantis em cmd se no relançamento do cromo não me mostrar erros?

Respostas (5)

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

A forma adequada de fechar/sair de um programa depende, em última análise, do software. Contudo, geralmente a melhor prática é que os programas Windows fechem sempre que recebem a mensagem WM_CLOSE. Liberação adequada de memória e alças de fechamento. Existem outras mensagens que podem sinalizar o fecho da aplicação, mas cabe ao autor do software saber como cada mensagem é tratada.

taskkill /IM process.exe

taskkill envia a mensagem WM_CLOSE e depois cabe à aplicação decidir se fecha correctamente. Também pode querer usar a opção /T para sinalizar processos infantis.

Use a opção /F apenas se quiser forçar a conclusão do processo.

Outras opções incluiriam o envio das chaves Alt+F4, usando o PowerShell, ou aplicações de terceiros.

Update to Updated Question

Ignorar, os erros. O cromado gera muitos processos. Os erros são causados quando um processo não reconhece a mensagem WM_CLOSE que a TASKKILL envia. Só os processos com um loop de mensagens poderão receber a mensagem, portanto, os processos que não têm um loop de mensagens gerarão esse erro. Muito provavelmente, estes processos são as extensões cromadas e plugins.

Para ocultar os erros capturar a saída

taskkill /IM chrome.exe >nul

Resumo: TASKKILL é a forma adequada através da linha de comando para fechar aplicações por sua implementação WM_CLOSE e o Microsoft KB que eu liguei .

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

Tente NirCmd (Download: x86 x64 )

Tem o comando “closeprocess” que é projetado para fechar processos graciosamente. Segundo o seu documento, não termina as aplicações mas envia WM_CLOSE para todas as janelas de nível superior do processo de destino. Exemplo de utilização de

nircmd closeprocess chrome.exe

Se isto não funcionar, aposto que a sua aplicação tem um procedimento de limpeza invulgar. Gostaria de ver o que acontece no interior, por isso, por favor, digam-me qual é a vossa aplicação alvo.

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?

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

Pode enviar `WMCLOSE_ mensagens para qualquer janela que deseje fechar. Muitas janelas tratam _WMCLOSE` para pedir ao utilizador para guardar documentos.

Uma ferramenta que faz isto correctamente é @Kill . Veja também SendMsg .


Eu não sei como fazer isto em lote, mas pode usar o vbscript para isto. Simular as teclas Alt + F4 (equivale ao sinal `WMCLOSE`_).

Execute e veja 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 é a lista de nomes de teclas para SendKeys.

Quando corre o script, o notepad está aberto, algumas palavras são escritas e depois é entregue um sinal para fechar o programa, veja a imagem abaixo.


Perguntas adicionais

Posso iniciar um programa minimizado, ou background com vbscript?

Sim. Utilize o seguinte código:

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

Para mais informações verifique os Run Method .

Can chrome go to some url in vbscript?

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

Se o cromo for o padrão, utilize:

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

Source

Existe uma forma de focalizar uma aplicação específica (chrome. exe)? Here num exemplo.

Só quero enviar alt+f4 para o cromado, independentemente do que estou a fazer com outras janelas.

O seguinte código funciona em 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}"
3
3
3
2014-03-11 21:18:50 +0000

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

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

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

Muito bem, não vou mentir. Vi isto no stackoverflow e achei que era uma pergunta difícil. Acabei de passar as últimas duas horas a escrever um código. E aqui está….

Depois de seguir os passos abaixo, pode digitar “TaskClose notepad.exe” depois de carregar em “Start” e irá guardar automaticamente todos os ficheiros do bloco de notas não documentados no ambiente de trabalho. Irá fechar automaticamente o ficheiro chrome.exe e guardar as definições de restauração.

Pode adicionar e remover definições adicionais para outras aplicações sob as condições do 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 ficheiros vbs e batch executam os seguintes procedimentos:

  • Recolhe o executável.
  • Consulta os nomes das aplicações executáveis da lista de tarefas.
  • Executa um procedimento “Alt+TAB(x)” até ter verificado que a janela está aberta.
  • Depois executa os comandos rolantes quer seja “Alt+F4” ou mesmo em casos extremos
  • Alt+F4
  • Activate Save
  • AutoIncrememnt Filename
  • Exit application.

ReturnAppList.bat : instalar em “C:\system32\”

for /f "tokens=10 delims=," %%F in ('tasklist /v /fi "imagename eq %1" /fo csv') do @echo %%~F >>result.txt

TaskClose.bat : instalar em “C:\system32\”. E “C:\Users\sYourUserName\”

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

TaskClose.vbs : instalar em “C:\windows32\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

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