具有多个参数的Shutdown.exe进程不工作

本文关键字:exe 进程 工作 Shutdown 参数 | 更新日期: 2023-09-27 18:20:37

我想创建一个进程,在给定时间后使用shutdown.exe关闭计算机。

这是我的代码:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = "shutdown.exe";
startInfo.Arguments = "–s –f –t " + seconds;
Process.Start(startInfo);

其中seconds是int局部变量,由用户决定。

当我运行代码时,什么都不会发生。但当我手动进入cmd提示符并键入:
shutdown.exe-s-f-t 999
然后Windows会弹出一个窗口,告诉我系统将在16分钟后关闭。

我认为这是因为有多个参数,是因为我中止正在进行的系统关闭的方法有效(我从cmd提示符手动创建了系统关闭)。这几乎是一样的,除了startInfo.Argument:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = "shutdown.exe";
startInfo.Arguments = "-a";
Process.Start(startInfo);

具有多个参数的Shutdown.exe进程不工作

快速检查shutdown.exe的用法消息会发现,它需要斜杠("/")后面的选项参数,而不是短划线("-")。

更换线路:

        startInfo.Arguments = "–s –f –t " + seconds;

带有:

        startInfo.Arguments = "/s /f /t " + seconds;

使用C#express 2010在我的盒子上产生了一个工作结果。

此外,您还可以将标准错误和标准从启动的进程中重定向出来,让程序读取,这样您就可以告诉程序运行后发生了什么。要做到这一点,您可以存储Process对象并等待底层进程退出,这样您就可以检查是否一切顺利。

        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardError = true;
        Process p = Process.Start(startInfo);
        string outstring = p.StandardOutput.ReadToEnd();
        string errstring = p.StandardError.ReadToEnd();
        p.WaitForExit();

不幸的是,我无法告诉您为什么命令行版本在选项上接受"短划线"前缀,而C#执行版本不接受。然而,希望你想要的是一个有效的解决方案。

以下代码的完整列表:

        int seconds = 100;
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.CreateNoWindow = false;
        startInfo.UseShellExecute = false;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.FileName = "shutdown.exe";
        startInfo.Arguments = "/s /f /t " + seconds;
        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardError = true;
        Process p = Process.Start(startInfo);
        string outstring = p.StandardOutput.ReadToEnd();
        string errstring = p.StandardError.ReadToEnd();
        p.WaitForExit();