通过C#运行时无法识别BCDEDIT

jam*_*mes 7 c# windows

当我尝试从我的C#应用​​程序运行BCDEDIT时,我收到以下错误:

'bcdedit'未被识别为内部或外部命令,可操作程序或批处理文件.

当我通过提升命令行运行它时,我得到了预期.

我使用了以下代码:

            Process p = new Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.FileName = @"CMD.EXE";
            p.StartInfo.Arguments = @"/C bcdedit";
            p.Start();
            string output = p.StandardOutput.ReadToEnd();
            String error = p.StandardError.ReadToEnd();
            p.WaitForExit();
            return output;
Run Code Online (Sandbox Code Playgroud)

我也试过用

p.StartInfo.FileName = @"BCDEDIT.EXE";
p.StartInfo.Arguments = @"";
Run Code Online (Sandbox Code Playgroud)

我尝试过以下方法:

  1. 检查路径变量 - 它们没问题.
  2. 从提升的命令提示符运行visual studio.
  3. 放置完整的路径.

我的想法已经用完了,知道为什么我会收到这个错误?

我需要的是命令的输出,如果有另一种方式也可以工作.谢谢

Dav*_*nan 14

有一种解释是有道理的:

  1. 您正在64位计算机上执行该程序.
  2. 您的C#程序构建为x86.
  3. bcdedit.exe文件存在于C:\Windows\System32.
  4. 虽然C:\Windows\System32在您的系统路径上,但在x86进程中,您需要使用文件系统重定向器.这意味着C:\Windows\System32实际上解决了C:\Windows\SysWOW64.
  5. 有没有32位版本bcdedit.exeC:\Windows\SysWOW64.

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


use*_*375 6

如果您在32位/ 64位Windows上遇到x86应用程序并且需要调用bcdedit命令,这里有一种方法:

private static int ExecuteBcdEdit(string arguments, out IList<string> output)
{
    var cmdFullFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows),
                                       Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess
                                           ? @"Sysnative\cmd.exe"
                                           : @"System32\cmd.exe");

    ProcessStartInfo psi = new ProcessStartInfo(cmdFullFileName, "/c bcdedit " + arguments) { UseShellExecute = false, RedirectStandardOutput = true };
    var process = new Process { StartInfo = psi };

    process.Start();
    StreamReader outputReader = process.StandardOutput;
    process.WaitForExit();
    output = outputReader.ReadToEnd().Split(new[] { Environment.NewLine }, StringSplitOptions.None).ToList();
    return process.ExitCode;
}
Run Code Online (Sandbox Code Playgroud)

用法:

var returnCode = ExecuteBcdEdit("/set IgnoreAllFailures", out outputForInvestigation);
Run Code Online (Sandbox Code Playgroud)

灵感来自这个线程以及如何从32位进程http://www.samlogic.net/articles/sysnative-folder-64-bit-windows.htm 启动64位进程