如何通过Windows上的CMD提示发送Shutdown命令进行处理

时间:2011-07-26 13:41:52

标签: windows command-line batch-file shutdown

我目前正在担任软件开发人员,而且我正在使用大量工具,因此我需要在完成工作后关闭它们。所以我做了什么,我用tskill命令和我使用的程序列表创建了批处理文件。

tskill skype
tskill outlook
tskill devenv
tskill explorer
start explorer

这有一个问题,当进程被杀死时,工具的更改不会保存,例如最后一个项目,打开的文件,控件的可视位置和所有其他内容。这些设置仅在您关闭工具时保存,但单击每个设置实际上非常耗时。

所以我的问题是:我可以向软件发送shutdown命令而不是杀死进程吗?

注意: 我需要CMD命令,而不是编程解决方案,正如我上面提到的,我需要像“tskill skype”这样的命令来杀死skype进程。 Windows可以发送此命令,因为当您关闭窗口时,Windows正在向所有正在运行的程序发送shutdown命令。但是,如果无法关闭,那么就像我上面那样杀死窗口。

提前致谢。

3 个答案:

答案 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