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

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

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

Estoy tratando de cerrar chrome bajo 3 versiones diferentes de ventanas: win7 ultimate, win7 home, winXP

Bajo Ultimate y XP: TSKILL chrome

Bajo Home: TASKKILL /IM chrome.exe

TSKILL chrome:

(Cierra el cromo, no hay errores de cmd, pero error de cromo restore al relanzarlo)

TASKKILL /IM chrome.exe:

(Cierra el cromo, no hay errores de cromo al relanzarlo, pero errores en cmd: “Imposible terminar los procesos hijo (unos 4-5), sólo a la fuerza con /F”)

¿Debo ignorar los errores hijo del cmd si al relanzarlo el cromo no me muestra ningún error?

Respuestas (5)

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

La forma correcta de cerrar/salir de un programa depende en última instancia del software. Sin embargo, generalmente la mejor práctica es que los programas de Windows se cierren cuando reciben el mensaje WM_CLOSE. Liberando adecuadamente la memoria y cerrando las manijas. Hay otros mensajes que pueden señalar 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 depende entonces de la aplicación si se cierra correctamente. También puede querer usar la opción /T para señalar también los procesos hijos.

Sólo use la opción /F si quiere forzar la terminación del proceso.

Otras opciones incluirían el envío de las teclas Alt+F4, usando PowerShell, o aplicaciones de terceros.

Actualización de la Pregunta Actualizada

Ignorar, los errores. Chrome genera muchos procesos. Los errores se producen cuando un proceso no reconoce el mensaje WM_CLOSE que envía TASKKILL. Sólo 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 las extensiones y plugins de chrome.

Para ocultar los errores capturar la salida

taskkill /IM chrome.exe >nul

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

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

Prueba NirCmd (Descarga: x86 x64 )

Tiene el comando “closeprocess” que está diseñado para cerrar los procesos con gracia. Según su documento, no termina las aplicaciones sino que envía WM_CLOSE a 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 lo que sucede dentro, así que por favor hágame saber cuál es su aplicación objetivo.

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 respuesta a esa pregunta se puede encontrar here (Microsoft link).

Puedes enviar mensajes `WMCLOSE_ a cualquier ventana que desees cerrar. Muchas ventanas manejan _WMCLOSE` para pedir al usuario que guarde documentos.

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


No sé cómo hacer esto en lote, pero podría usar el vbscript para esto. Simulando las teclas Alt + F4 (equivale a la señal `WMCLOSE`_).

Ejecute y mire 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 de teclas para SendKeys.

Cuando ejecuta el script, el notepad se abre, se escriben algunas palabras y luego se entrega una señal para cerrar el programa, vea la imagen de abajo.

  • *

Preguntas adicionales

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

Sí. Use el siguiente código:

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

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

¿Puedo cromar en alguna url en vbscript?

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

Si el cromo es el predeterminado, use:

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

Source

¿Hay alguna manera de enfocar una aplicación específica (cromo. exe)? Here en un ejemplo.

Quiero enviar alt+f4 SOLAMENTE al cromado, independientemente de lo que haga 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}"
3
3
3
2014-03-11 21:18:50 +0000

Hay algunas utilidades de línea de comandos que pueden enviar un mensaje adecuado WM_SYSCOMMAND (con SC_CLOSE como 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().)

La utilidad de línea de comandos que viene como un comando incorporado en JP Software’s TCC , un intérprete de comandos y procesador de scripts de comandos para Windows, se llama TASKEND .

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

De acuerdo, no voy a mentir. Vi esto en Stackoverflow y pensé que era una pregunta desafiante. Así que pasé las últimas dos horas escribiendo un código. Y aquí está…

Después de seguir los pasos de abajo, puedes escribir “TaskClose notepad.exe” después de pulsar “Start” y se guardarán automáticamente todos los archivos del bloc de notas sin documentar en el escritorio. Cerrará automáticamente chrome.exe y guardará la configuración de restauración.

Puede agregar y eliminar configuraciones adicionales para otras aplicaciones en 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 batch realizan los siguientes procedimientos:

  • Recolecta 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
  • AutoIncrememntar nombre de archivo
  • Salir de la aplicación.

ReturnAppList.bat : instalar en “C:|sistema32”

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:|sistema32” Y “C:|Nombre de usuario”

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

TaskClose.vbs : instalar en “C:|Sistema de ventanas32”

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

Esto fue muy divertido de escribir y estoy más feliz de terminarlo que de mostrar la respuesta. ¡Que tengas una gran semana!