我目前正在担任软件开发人员,而且我正在使用大量工具,因此我需要在完成工作后关闭它们。所以我做了什么,我用tskill命令和我使用的程序列表创建了批处理文件。
tskill skype
tskill outlook
tskill devenv
tskill explorer
start explorer
这有一个问题,当进程被杀死时,工具的更改不会保存,例如最后一个项目,打开的文件,控件的可视位置和所有其他内容。这些设置仅在您关闭工具时保存,但单击每个设置实际上非常耗时。
所以我的问题是:我可以向软件发送shutdown命令而不是杀死进程吗?
注意: 我需要CMD命令,而不是编程解决方案,正如我上面提到的,我需要像“tskill skype”这样的命令来杀死skype进程。 Windows可以发送此命令,因为当您关闭窗口时,Windows正在向所有正在运行的程序发送shutdown命令。但是,如果无法关闭,那么就像我上面那样杀死窗口。
提前致谢。
答案 0 :(得分:19)
在Windows 7上测试:
taskkill /IM notepad.exe
请注意,您必须指定.exe
扩展名。我认为这可以满足您的需求:它不会简单地终止进程,而是发送“关闭”信号,这将显示“保存未保存的更改?”记事本和其他编辑器中的对话框。
答案 1 :(得分:1)
如果您的应用程序支持标准的Windows消息,您可以使用rmtool
欺骗应用程序并告诉它计算机正在关闭。见How to simulate Windows shutdown for debugging?
要编写脚本,您需要先找到进程的PID(来自sysinternals的pslist
提供信息,但您需要解析结果)。
如果他们不干净地关闭就像窗户关闭一样:使用rmtool让他们所有人都很好地退出然后30s后者杀死所有人仍然站着(对于前景和devenv它甚至可能有点短...)。
答案 2 :(得分:-3)
在结束进程之前无法发送save命令(至少不能使用批处理文件),但您可以从C#(控制台应用程序?)手动执行此操作。
using System.Diagnostics;
using System.Runtime.InteropServices;
class Program
{
[DllImport("user32.dll")]
public static extern int SetForegroundWindow(IntPtr hWnd);
static void Main(string[] args)
{
var ps = Process.GetProcessesByName("devenv");
foreach (var p in ps)
{
if (!p.MainWindowTitle.Contains("api"))
{
SetForegroundWindow(p.MainWindowHandle);
System.Windows.Forms.SendKeys.SendWait("^+S"); //simulates CTRL + SHIFT + S
p.CloseMainWindow();
}
}
}
我使用了VS定义的快捷方式File-> Save All
还有一种更难的方法,使用Windows Api,但你不想为简单的应用程序走这条路:):/ / p>
注意:您需要引用System.Windows.Forms