7

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;

私も使ってみました

p.StartInfo.FileName = @"BCDEDIT.EXE";
p.StartInfo.Arguments = @"";

私は次のことを試しました:

  1. パス変数をチェックしています - それらは問題ありません。
  2. 昇格したコマンド プロンプトから Visual Studio を実行しています。
  3. フルパスを配置します。

アイデアが不足しています。なぜこのエラーが発生するのかについてのアイデアはありますか?

同様に機能する別の方法がある場合、必要なのはコマンドの出力だけです。ありがとう

4

2 に答える 2

17

理にかなっている説明が 1 つあります。

  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. の 32 ビット バージョンはありませbcdedit.exeC:\Windows\SysWOW64

解決策は、C# プログラムを targetAnyCPUまたはに変更することx64です。

于 2012-12-24T16:06:41.253 に答える
6

32it/64bit 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;
}

利用方法:

var returnCode = ExecuteBcdEdit("/set IgnoreAllFailures", out outputForInvestigation);

このスレッドと、32 ビット プロセスから 64 ビット プロセスを開始する方法、およびhttp://www.samlogic.net/articles/sysnative-folder-64-bit-windows.htmからインスピレーションを得ました。

于 2014-11-12T17:01:52.880 に答える