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

C# 具有多个参数的Shutdown.exe进程不工作,c#,winforms,process,shutdown,processstartinfo,C#,Winforms,Process,Shutdown,Processstartinfo,我想创建一个进程,该进程使用shutdown.exe在给定时间后关闭计算机 这是我的密码: ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = false; startInfo.UseShellExecute = false; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.FileName = "shutdown.

我想创建一个进程,该进程使用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-t999
然后Windows会弹出一个窗口,告诉我系统将在16分钟内关闭

我认为这是因为有多个参数,是因为我中止正在进行的系统关闭的方法起作用(我在cmd提示符下手动创建了systemshutdown)。这几乎是相同的,除了startInfo。参数:


快速检查shutdown.exe的用法消息可以发现,它希望选项参数在斜杠(“/”)后面,而不是破折号(“-”)

更换线路:

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

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

此外,您还可以将标准错误和标准从启动的进程中重定向出来,以供程序读取,这样您就可以知道它运行后发生了什么。为此,您可以存储流程对象并等待底层流程退出,以便检查是否一切正常

        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardError = true;

        Process p = Process.Start(startInfo);
        string outstring = p.StandardOutput.ReadToEnd();
        string errstring = p.StandardError.ReadToEnd();
        p.WaitForExit();
不幸的是,我无法告诉您为什么命令行版本接受选项上的“破折号”前缀,而C#executed版本不接受。然而,希望你所追求的是一个有效的解决方案

下面是代码的完整列表:

        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();

您的机器是否在16分钟后带多个参数关闭?你试过秒=1吗?我问这个问题的原因是,我想知道您将WindowsStyle设置为Hidden的事实是否有任何影响?这里可能没有什么用处,但不知道关于可执行文件的任何信息,如果您指定
UseShellExecute=true
,那么会发生什么?当我将代码更改为以下内容时仍然没有发生任何事情:startInfo.Arguments=“–s–f–t 1”; 我知道有点不对劲,因为我很快就能看到cmd提示符,那里显示的命令输入不正确。我设法得到了它的一个屏幕截图:在这种情况下,我建议尝试用@ambrus的答案捕获输出,看看输出是什么。+1,尽管我确信
-
在这种情况下与
/
一样有效。(假设cmd.exe不转换为/,这会很奇怪。)非常感谢。我没有收到这条消息,因为cmd提示窗口几乎立即消失,而且帮助时间太长,我无法在屏幕截图中捕捉到这条消息。你显示的输出和错误处理非常好,再次感谢。对我来说不起作用。这个过程启动得太快以至于崩溃。有什么想法吗?
        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardError = true;

        Process p = Process.Start(startInfo);
        string outstring = p.StandardOutput.ReadToEnd();
        string errstring = p.StandardError.ReadToEnd();
        p.WaitForExit();
        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();