c# - 使用 RedirectStandardOutput 运行 ChkDsk

标签 c# wpf process

在不重定向 StandardOutput 的情况下运行 ChkDsk 不会出现如下错误:

var processStartInfo = new ProcessStartInfo(@"chkdsk.exe", "D:");
processStartInfo.UseShellExecute = false;
var process = Process.Start(processStartInfo);
process.WaitForExit();
if (process.ExitCode != 0)
    throw new Exception("did not work");

当重定向 StandardOutput 时,进程以 ExitCode 3 结束。

var processStartInfo = new ProcessStartInfo(@"chkdsk.exe", "D:");
processStartInfo.RedirectStandardOutput = true;
processStartInfo.UseShellExecute = false;
var process = Process.Start(processStartInfo);
process.WaitForExit();
if (process.ExitCode != 0)
    throw new Exception("did not work");

用例如做同样的事情net use 和重定向的 StandardOutput 正常工作

var processStartInfo = new ProcessStartInfo(@"net ", "use");

为什么?如何执行 chkdsk 并重定向 StandardOutput

环境:Win 7 Pro x64,禁用 UAC,以管理员身份登录,Dot Net 4.0,VS 2012,WPF 应用程序

最佳答案

我只是毫无问题地运行了这段代码,退出代码为 0

var cd = RunProcessDirect("chkdsk.exe", "c:", false);

protected ConsoleData RunProcessDirect(string processPath, string args, 
    bool isHidden)
{
    Process process = SetupProcess(processPath, args, isHidden);
    process.Start();

    ConsoleData data = new ConsoleData();
    data.StandardOutput = process.StandardOutput.ReadToEnd();
    data.StandardError = process.StandardError.ReadToEnd();
    data.ExitCode = process.ExitCode;

    return data;
}

private Process SetupProcess(string processPath, string args, 
    bool isHidden)
{
    Process process = new Process();
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.WindowStyle = isHidden 
        ? ProcessWindowStyle.Hidden 
        : ProcessWindowStyle.Normal;
    startInfo.CreateNoWindow = isHidden;
    startInfo.FileName = processPath;
    startInfo.Arguments = args;
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardError = true;
    startInfo.UseShellExecute = false;

    process.StartInfo = startInfo;
    return process;
}

public class ConsoleData
{
    public string StandardOutput { get; set; }
    public string StandardError { get; set; }
    public int ExitCode { get; set; }
}

cd.StandardOutput 包含程序的所有文本输出,cd.StandardError 为空,cd.ExitCode 0

不要担心 IsHidden 的东西,那只是我的方法的额外天赋,我不想起飞。

关于c# - 使用 RedirectStandardOutput 运行 ChkDsk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20076929/

相关文章:

wpf - 从 WPF 拖放至 Excel

c - C 中的进程间通信

c# - 如何使用 httpclient c# 将文件上传到 ASANA api 中的任务

c# - 使用 Linq Where 子句时返回对象的问题

c# - 如何将多个ViewModel嵌套在顶级ViewModel中,并以一种可以分散在整个View中的层次结构进行嵌套?

c# - 以更高的权限启动进程并读取其输出

c - C中的进程同步不会第一次执行

c# - 如何处理层与层之间的输入和参数验证?

c# - LINQ 使用 "like"而不是 "(( NVL(INSTR(x, y), 0) ) = 1)"

c# - UserControl 中的 TextBlock 不显示文本