首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过C#运行时无法识别BCDEDIT

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

Stack Overflow用户
提问于 2012-12-24 15:21:54
回答 2查看 6.6K关注 0票数 7

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

“‘bcdedit”不被识别为内部或外部命令、可操作的程序或批处理文件。

当我通过提升的命令行运行它时,我得到了预期的结果。

我使用了以下代码:

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

我也试过用

代码语言:javascript
复制
p.StartInfo.FileName = @"BCDEDIT.EXE";
p.StartInfo.Arguments = @"";

我尝试了以下几点:

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

我的想法不多了,知道我为什么会犯这个错误吗?

我所需要的只是命令的输出,如果有另一种方式也能工作的话。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-24 16:06:41

有一个解释是有道理的:

  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中没有32位版本的C:\Windows\SysWOW64

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

票数 17
EN

Stack Overflow用户

发布于 2014-11-12 17:01:52

如果您在32it/64位Windows上都使用x86应用程序,并且需要调用bcdedit命令,下面是一种方法:

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

用法:

代码语言:javascript
复制
var returnCode = ExecuteBcdEdit("/set IgnoreAllFailures", out outputForInvestigation);

灵感来自这个线程,来自How to start a 64-bit process from a 32-bit processhttp://www.samlogic.net/articles/sysnative-folder-64-bit-windows.htm

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14023051

复制
相关文章

相似问题

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