首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RedirectStandardOutput运行CheckDisk

使用RedirectStandardOutput运行CheckDisk
EN

Stack Overflow用户
提问于 2013-11-20 00:32:48
回答 4查看 915关注 0票数 3

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

代码语言:javascript
复制
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结束。

代码语言:javascript
复制
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执行相同的操作,没有错误

代码语言:javascript
复制
var processStartInfo = new ProcessStartInfo(@"net ", "use");

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

环境:Win7专业版x64、禁用UAC、以管理员身份登录、Dot Net 4.0、VS 2012、WPF应用程序

EN

回答 4

Stack Overflow用户

发布于 2013-11-20 00:58:02

我刚刚运行了这段代码,没有问题,退出代码为0

代码语言:javascript
复制
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.ExitCode0

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-20 01:14:36

您必须以管理员身份运行Visual Studio,它将执行,或者您可以添加一个应用程序清单文件(添加->新项->常规->应用程序清单文件),并将此行<requestedExecutionLevel level="asInvoker" uiAccess="false" />更改为此<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />,这将提示您以管理员身份重新启动visual studio。

票数 1
EN

Stack Overflow用户

发布于 2016-09-02 10:12:48

简单的答案是,在非控制台应用程序上启动控制台进程;如果您希望重定向标准输出,请也重定向标准输入(即使您不使用它)。

所以,只要在你的代码中添加下面两行,它就可以工作了。

代码语言:javascript
复制
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardError = true;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20076929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档