从命令行关闭程序(Windows)

从命令行关闭程序(Windows)

从命令行关闭/退出程序的正确方法是什么,类似于按下窗口角落的“X”关闭按钮?

我尝试在 3 个不同版本的 Windows 下关闭 chrome:win7 ultimate、win7 home、winXP

在 Ultimate 和 XP 下:TSKILL chrome

主页下: TASKKILL /IM chrome.exe


TSKILL chrome:

(它关闭了 chrome,没有 cmd 错误,
但是 chrome 错误恢复重新启动时)


TASKKILL /IM chrome.exe

(它关闭了 chrome,重新启动时没有 chrome 错误,
但 cmd 中出现错误:“无法终止子进程(大约 4-5 个),只能强制终止/F”)


如果重新启动 chrome 时没有显示错误,我是否应该忽略 cmd 子错误?

答案1

关闭/退出程序的正确方法最终取决于软件。但是,通常最佳做法是 Windows 程序在收到 WM_CLOSE 消息时关闭。正确释放内存并关闭句柄。还有其他消息可以发出应用程序关闭的信号,但如何处理每条消息取决于软件作者。

taskkill /IM process.exe

taskkill 发送 WM_CLOSE 消息,然后由应用程序决定是否正确关闭。您可能还想使用该/T选项向子进程发出信号。

/F仅当您想强制终止该进程时才使用该选项。

其他选项包括发送 Alt+F4 键、使用 PowerShell 或第三方应用程序。

更新至已更新问题

忽略错误。 Chrome 会生成许多进程。当某个进程未确认 TASKKILL 发送的 WM_CLOSE 消息时,就会引发错误。只有具有消息循环的进程才能接收该消息,因此,没有消息循环的进程将生成该错误。最有可能的是,这些进程是 Chrome 扩展程序和插件。

要隐藏错误捕获输出

taskkill /IM chrome.exe >nul

概括:TASKKILL 是通过命令行关闭应用程序的正确方法,按照其 WM_CLOSE 实现,并且我链接的 Microsoft KB

答案2

尝试近红外命令(下载:x86 x64

它有“closeprocess”命令,用于正常关闭进程。根据其文档,它不会终止应用程序,而是发送WM_CLOSE到目标进程的所有顶层窗口。

使用示例:

nircmd 关闭进程 chrome.exe

如果这不起作用,我敢打赌你的应用程序有一个不寻常的清理过程。我想看看里面发生了什么,所以请告诉我你的目标应用程序是什么。

答案3

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?

这个问题的答案可以找到here微软链接)。

你可以发送WM_CLOSE消息发送到您想要关闭的任何窗口。许多窗口处理WM_CLOSE提示用户保存文档。

可以正确执行此操作的工具是@Kill. 另见发送消息


我不知道如何批量执行此操作,但您可以使用 vbscript 执行此操作。模拟Alt+F4键(相当于信号WM_CLOSE)。

运行并查看下面此脚本的行为。

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是 SendKeys 的列表键名称。

运行脚本时,记事本打开后,写入一些单词,然后发出关闭程序的信号,见下图。


其他问题

我可以使用 vscript 启动最小化或后台程序吗?

是的。使用以下代码:

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

欲了解更多信息,请查看Run Method

chrome 可以在 vbscript 中转到某个 url 吗?

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

如果默认是 chrome,则使用:

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

Source

有没有办法把焦点集中在特定的应用程序上(chrome 安装程序)?

Here在一个例子中。

我只想将 alt+f4 发送到 chrome,与我对其他窗口的操作无关。

以下代码适用于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}"

答案4

好吧,我不会撒谎。我在 stackoverflow 上看到这个问题,觉得这是一个很有挑战性的问题。所以我花了 2 个小时写了一些代码。这就是它……

按照以下步骤操作后,您可以在点击“开始”后输入“TaskClose notepad.exe”,它会自动将所有未记录的记事本文件保存到桌面。它会自动关闭 chrome.exe 并保存恢复设置。

您可以在 if 条件下添加和删除其他应用程序的其他设置。例如:

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

vbs 和批处理文件执行以下操作过程:

  • 收集可执行文件。
  • 从任务列表中查询可执行应用程序的名称。
  • 执行“Alt+TAB(x)”程序,直到确认窗口已打开。
  • 然后执行滚动命令,无论是“Alt+F4”,还是在极端情况下
  • Alt+F4
  • 激活保存
  • 自动增加文件名
  • 退出应用程序。

ReturnAppList.bat :安装在“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 :安装在“C:\windows\system32\”和“C:\Users\YourUserName\”中

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

TaskClose.vbs : 安装在“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

写这篇文章很有趣,我更高兴的是写完了它,而不是真正地展示答案。祝你度过愉快的一周!

相关内容