从命令行关闭/退出程序的正确方法是什么,类似于按下窗口角落的“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
答案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
提示用户保存文档。
我不知道如何批量执行此操作,但您可以使用 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)
有没有办法把焦点集中在特定的应用程序上(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
写这篇文章很有趣,我更高兴的是写完了它,而不是真正地展示答案。祝你度过愉快的一周!