Cerrar programas desde la línea de comandos (Windows)

49

¿Cuál es la forma correcta de cerrar / salir de programas desde la línea de comandos, de manera similar a presionar el botón de cierre "X" en la esquina de la ventana?

Estoy tratando de cerrar Chrome en 3 versiones diferentes de Windows: win7 ultimate, win7 home, winXP

Bajo Ultimate y XP: TSKILL chrome

Debajo de casa TASKKILL /IM chrome.exe


TSKILL chrome:

(Cierra Chrome, no hay errores de cmd,
pero se restaura el error de Chrome cuando se reinicia)


TASKKILL /IM chrome.exe:

(Cierra Chrome, no hay errores de Chrome al relanzarlo,
pero errores en cmd: "imposible terminar procesos secundarios (aproximadamente 4-5), solo por la fuerza con /F")


¿Debo ignorar los errores secundarios de cmd si en el reinicio de Chrome no se muestran errores? ?

neoDev
fuente
@MosheKatz: ¿Me puede mostrar algún ejemplo de código de salida por favor? Me gustaría saber qué sucede cuando
presiono el
66
Taskkill envía un mensaje WM_CLOSE al programa de destino a menos que se especifique / F (terminación forzada), para permitir que el programa tenga posibilidades de limpiarse. Pruebe esto con el Bloc de notas: abra un bloc de notas y escriba algo allí, e ingrese "taskkill / im notepad.exe". Verá un mensaje para guardar los datos.
Scott Rhee
@ScottRhee: Ya intenté ejecutarlo sin / F, pero parece ser un cierre inadecuado ... ¿Me equivoco?
neoDev
@ScottRhee: ¡Estoy intentando con Chrome también! A veces, cuando lo relancé, dice "restaurar pestañas" en una línea amarilla debajo de la URL similar a esta: backroom.bostonproductions.com/wp-content/uploads/2012/07/…
neoDev
@Roger Eso es extraño ya que no recibo ese mensaje con Taskkill / IM chrome.exe. De todos modos, creo que hiciste lo correcto. Escribí una respuesta a continuación, así que inténtalo en su lugar.
Scott Rhee

Respuestas:

43

La forma correcta de cerrar / salir de un programa depende en última instancia del software. Sin embargo, en general, la mejor práctica es que los programas de Windows se cierren siempre que reciban el mensaje WM_CLOSE. Liberar adecuadamente la memoria y cerrar las manijas. Hay otros mensajes que pueden indicar el cierre de la aplicación, pero depende del autor del software cómo se maneja cada mensaje.

taskkill /IM process.exe

taskkill envía el mensaje WM_CLOSE y luego depende de la aplicación si se cierra correctamente. También es posible que desee utilizar la /Topción para señalar también procesos secundarios.

Utilice la /Fopción solo si desea forzar la finalización del proceso.

Otras opciones incluirían enviar las teclas Alt + F4, usar PowerShell o aplicaciones de terceros.

Actualizar a pregunta actualizada

Ignora los errores. Chrome genera muchos procesos. Los errores se producen cuando un proceso no reconoce el mensaje WM_CLOSE que envía TASKKILL. Solo los procesos con un bucle de mensaje podrán recibir el mensaje, por lo tanto, los procesos que no tienen un bucle de mensaje generarán ese error. Lo más probable es que estos procesos sean extensiones y complementos de Chrome.

Para ocultar los errores captura la salida

taskkill /IM chrome.exe >nul

Resumen: TASKKILL es la forma correcta a través de la línea de comandos para cerrar aplicaciones según su implementación WM_CLOSE y el KB de Microsoft que he vinculado .

David Ruhmann
fuente
Actualicé
@Roger actualizó mi respuesta.
David Ruhmann
¿Qué significa> nul?
neoDev
10
>es el operador de redireccionamiento para el cmd.exe y nules el vacío del espacio donde las cosas nunca volverán a ser escuchadas.
David Ruhmann
9

Prueba NirCmd (Descarga: x86 x64 )

Tiene el comando "closeprocess" que está diseñado para cerrar procesos con gracia. Según su documento, no termina las aplicaciones, sino que las envía WM_CLOSEa todas las ventanas de nivel superior del proceso de destino.

ejemplo de uso:

nircmd closeprocess chrome.exe

Si esto no funciona, apuesto a que su aplicación tiene un procedimiento de limpieza inusual. Me gustaría ver qué sucede dentro, así que avíseme cuál es su aplicación de destino.

Scott Rhee
fuente
Actualicé
Encontré que esto funciona mejor: nircmd gana el título de cierre "Título de mi proceso"
user1495323
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 respuesta a esa pregunta se puede encontrar here( enlace de Microsoft ).

Puede enviar WM_CLOSEmensajes a cualquier ventana que desee cerrar. Muchas ventanas manejan WM_CLOSEpara solicitar al usuario que guarde documentos.

Una herramienta que hace esto correctamente es @Kill. Mira también SendMsg .


No sé cómo hacer esto por lotes, pero podría usar el vbscript para esto. Simulando las teclas Alt+ F4(equivale a señal WM_CLOSE).

Ejecute y observe el comportamiento de este script a continuación.

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 es la lista de nombres clave para SendKeys.

Cuando ejecuta el script, el bloc de notas está abierto, se escriben algunas palabras y luego se entrega una señal para cerrar el programa, vea la imagen a continuación.


Preguntas adicionales

¿Puedo iniciar un programa minimizado o en segundo plano con vbscript?

Si. Utiliza el siguiente código:

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

Para más información consulte el Run Method.

¿Puede Chrome ir a alguna url en vbscript?

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

Si Chrome es el predeterminado, use:

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

Source

¿Hay alguna manera de enfocar una aplicación específica ( chrome.exe )?

Here en un ejemplo

Quiero enviar alt + f4 SOLAMENTE a Chrome, independientemente de lo que esté haciendo con otras ventanas.

El siguiente código funciona en 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
fuente
¿Puedo iniciar un programa minimizado o en segundo plano con vbscript?
neoDev
1
@Roger Si está interesado, vea mi respuesta aquí sobre cómo combinar Batch + JScript en un solo archivo. JScript puede hacer casi cualquier cosa que VBScript pueda hacer y en un estilo C más estructurado.
David Ruhmann
y puede Chrome ir a alguna url en vbscript?
neoDev
¿Hay alguna manera de enfocar una aplicación específica (chrome.exe)?
neoDev
Sí, lo estoy intentando, pero si después de algún retraso (WScript.Sleep 5000) tengo (WshShell.AppActivate "google chrome"), si durante este período hago clic en otra ventana, google chrome no aparece al frente , puedo ver su enfoque solo en la barra de herramientas ...
neoDev
3

Hay algunas utilidades de línea de comandos que pueden enviar un WM_SYSCOMMANDmensaje adecuado (con SC_CLOSEel comando) a la ventana de nivel superior de un programa. Estoy seguro de que al menos uno será mencionado en breve. (Entonces alguien mencionará AutoIt. Luego habrá una respuesta que muestre cómo hacerlo con PowerShell y CloseMainWindow()).

Se llama a la utilidad de línea de comandos que viene como un comando incorporado en TCC de JP Software , un intérprete de comandos y un procesador de script de comandos para Windows TASKEND.

JdeBP
fuente
Actualicé
2

Muy bien, no voy a mentir. Vi esto en stackoverflow y pensé que era una pregunta desafiante. Así que acabo de pasar las últimas 2 horas escribiendo un código. Y aquí está....

Después de seguir los pasos a continuación, puede escribir "TaskClose notepad.exe" después de presionar "Inicio" y guardará automáticamente todos los archivos de bloc de notas no documentados en el escritorio. Se cerrará automáticamente chrome.exe y guardará la configuración de restauración.

Puede agregar y eliminar configuraciones adicionales para otras aplicaciones bajo las condiciones if. Por ejemplo:

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

Los archivos vbs y por lotes realizan los siguientes procedimientos:

  • Recoge el ejecutable.
  • Consulta los nombres de las aplicaciones ejecutables fuera de la lista de tareas.
  • Realiza un procedimiento "Alt + TAB (x)" hasta que haya verificado que la ventana está abierta.
  • Luego ejecuta los comandos rodantes ya sea "Alt + F4" o incluso en casos extremos
  • Alt + F4
  • Activar Guardar
  • Nombre de archivo de AutoIncrememnt
  • Salir de la aplicación.

ReturnAppList.bat: instalar en "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: instalar en "C: \ windows \ system32 \" Y "C: \ Users \ YourUserName \"

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

TaskClose.vbs: instalar en "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

Fue muy divertido escribirlo y estoy más feliz de terminarlo que de mostrar la respuesta. ¡Que tengas una buena semana!

Rico
fuente