从C#进程启动时不执行Cmd命令(ewfmgr C:-commit)

时间:2018-08-14 12:07:48

标签: c# cmd command

当我尝试从C#运行cmd命令'efwmgr C:-commit'时,得到了没有任何信息的空日志文件,当手动检查'ewfmgr C:'时,得到了'Boot Command NO_CMD',因此提交不运行。

刚刚更改了相同的代码参数=“ / C chkdsk C:”它运行并且运行良好,将整个输出插入到我的日志中。

我使用的方法。

public static void StartProcess()
{
    var procStartInfo = new ProcessStartInfo
    {
        CreateNoWindow = false,
        WindowStyle = ProcessWindowStyle.Normal,
        FileName = "cmd",
        Arguments = "/C ewfmgr C: -commit",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardInput = true,
        RedirectStandardError = true
    };

    var process = new Process { StartInfo = procStartInfo, EnableRaisingEvents = true };

    using (StreamWriter writer = new StreamWriter(@"D:\commitFile.txt"))
    {
        process.OutputDataReceived += (sender, e) =>
        {
            writer.WriteLine(e.Data);
        };

        process.Start();
        process.BeginOutputReadLine();
        process.WaitForExit();
    }
}

这是我在https://social.msdn.microsoft.com/Forums/vstudio/en-US/4e014365-8e8f-4f93-998a-156f2e55ebab/how-to-get-and-write-ewf-current-to-text-file-using-c?forum=csharpgeneral

上发现的几乎示例

2 个答案:

答案 0 :(得分:0)

您可能在过程错误输出流中遇到错误。在ErrorDataReceived事件处理程序中附加您的日志。对于'ewfmgr' is not recognized as an internal or external command,您应该编辑流程环境变量或指定应用程序的完整路径。 这是您的代码应如下所示:

var procStartInfo = new ProcessStartInfo
{
    CreateNoWindow = false,
    WindowStyle = ProcessWindowStyle.Normal,
    FileName = "cmd",

    //Append PATH environment variable bellow if you use this
    Arguments = "/C ewfmgr C: -commit",

    //Or use full path to application without changing environment variable
    //Arguments = "/C c:\full\path\to\application\ewfmgr C: -commit",

    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardInput = true,
    RedirectStandardError = true
 };
procStartInfo.EnvironmentVariables["PATH"] += @";c:\full\path\to\application\";
var process = new Process { StartInfo = procStartInfo, EnableRaisingEvents = true };

using (StreamWriter writer = new StreamWriter(@"D:\commitFile.txt"))
{
   process.OutputDataReceived += (sender, e) =>
   {
      writer.WriteLine(e.Data);
   };
   process.ErrorDataReceived+= (sender, e) =>
   {
      writer.WriteLine(e.Data);
   };
   process.Start();
   process.BeginOutputReadLine();
   process.BeginErrorReadLine();
   process.WaitForExit();
}

答案 1 :(得分:0)

只想为可能遇到此问题的任何人,或Windows / System32目录中“丢失”的任何其他文件指出有关此问题的更新:

首先要检查的是您的系统架构和流程架构:

关于此功能有好几篇文章(尽管我更喜欢称之为问题),我可以肯定地说this one解释了它的正确性,并且如果您设置架构的正确性,ewfmgr.exe也可以正常工作。 / p>

为了不依赖其他帖子/链接,我将在此处重写/复制大卫的答案:

有一种合理的解释:

  1. 您正在64位计算机上执行程序。
  2. 您的C#程序构建为x86。
  3. bcdedit.exe文件存在于C:\Windows\System32中。
  4. 尽管C:\Windows\System32在您的系统路径上,但是在x86进程中,您必须遵守File System Redirector。这意味着C:\Windows\System32实际上解析为C:\Windows\SysWOW64
  5. bcdedit.exe中没有C:\Windows\SysWOW64的32位版本。

解决方案是将您的C#程序更改为以AnyCPUx64为目标。

此外,我还要补充一点,默认情况下,C#的VS项目设置为“任何CPU”配置,但是在“构建”选项卡上的项目属性中选中了复选框,即“首选”。 32位”:需要取消选中/禁用此选项,否则“任何cpu”构建也将导致32位应用程序。

除此之外,我已经在我们的服务应用程序中成功实现了可正常使用的EWF管理器。不幸的是,使用pInvoke和ewfapi dll并没有带来任何运气,因为它似乎未返回正确的结果。我不确定执行中是否存在问题,或者EWF api本身是否损坏(说实话,它确实有错误和不可靠。对于我们来说,“ Disable”命令无任何作用-重新启动后,ewf为禁用它的唯一方法是禁用并提交,或使用CommitAndDisableLive,它们都不幸将当前状态提交到驱动器上,因此我必须使用回退并在禁用保护之前重新启动计算机,以确保其处于干净状态),因此我使用了命令行来调用它,并解析响应参数来控制它。不幸的是,这是时间紧迫的,我需要生产就绪的解决方案,所以我不得不采取一种解决方法,但是我将发布一个关于pInvoke的单独问题,然后将其作为最终解决方案全部放在GitHub上。

一旦有时间上载,我将返回并编辑该帖子以包含GitHub链接。如果有人立即需要它,我很乐意照原样发送。

希望有帮助。