通过c#运行时无法识别BCDEDIT
本文关键字:识别 BCDEDIT 运行时 通过 | 更新日期: 2023-09-27 17:49:30
当我尝试从我的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 = @"";
我已经尝试了以下操作:
- 检查路径变量-它们是好的。
- 从提升的命令提示符运行visual studio。
- 放置完整路径。
我已经没有主意了,关于为什么我得到这个错误的任何想法?
我所需要的是命令的输出,如果有另一种方法也可以工作的话。由于
有一个解释是合理的:
- 您正在64位计算机上执行程序。
- 你的c#程序是基于x86架构构建的。
-
bcdedit.exe
文件存在于C:'Windows'System32
中 - 虽然
C:'Windows'System32
在您的系统路径上,但在x86进程中,您受制于文件系统重定向器。这意味着C:'Windows'System32
实际上解析为C:'Windows'SysWOW64
。 -
C:'Windows'SysWOW64
中没有32位bcdedit.exe
版本
解决方案是更改您的c#程序以AnyCPU
或x64
为目标。
如果您在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;
}
用法:
var returnCode = ExecuteBcdEdit("/set IgnoreAllFailures", out outputForInvestigation);
灵感来自这个线程和如何从32位进程启动64位进程和http://www.samlogic.net/articles/sysnative-folder-64-bit-windows.htm