1

我不明白为什么从 ac 程序运行以下代码会返回“'bcdedit' 不是内部或外部命令”。bcdedit 在 cmd 行上运行良好。我怎样才能让它工作?

#include <stdio.h>

int main ()
{
    system("bcdedit");
    system("TIMEOUT /T 3");
    return(0);
}
4

3 回答 3

2

发生这种情况是因为当您Command Prompt通过“开始菜单”甚至“执行”窗口运行时,您正在运行位于 的 64 位cmd版本,C:\Windows\System32\cmd.exe但是当cmd从您的 c 程序调用时,它会调用位于 的 32 位cmd版本C:\Windows\SySWOW64\cmd.exe这是因为您的 C 编译器生成了一个 32 位应用程序。

根据 MSDN:

%windir%\System32 目录是为 64 位应用程序保留的。大多数 DLL 文件名在创建 64 位版本的 DLL 时没有更改,因此 32 位版本的 DLL 存储在不同的目录中。WOW64 通过使用文件系统重定向器隐藏了这种差异。

在大多数情况下,每当 32 位应用程序尝试访问 %windir%\System32 时,访问都会重定向到 %windir%\SysWOW64。

来源:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa384187%28v=vs.85%29.aspx

如果你比较两个cmds,你会发现它们是相同的,不同的是dll。

问题是 Windows x64bcdedit.exeSystem32文件夹中提供 64 位,但在任何地方都没有提供 32 位bcdedit.exe所以 32-bitcmd不能运行 64-bit bcdedit,所以返回这个命令无效。

解决方案:您既可以bcdedit从 Windows x86 版本获取 32 位,也可以编译 64 位应用程序。

于 2013-07-25T12:58:25.960 回答
1

很可能是因为它找不到可执行文件。确保您的路径正确(a)或使用完整路径名:

system ("c:\\windows\\system32\\bcdedit.exe");

而且,当然,这不言而喻:确保您以管理用户身份运行它。


(a)您应该能够通过以下方式确认这一点:

system ("path");
于 2012-05-31T04:52:57.990 回答
0

我认为您已将一个命令分为两部分。并且我认为您想运行“bcdedit.exe /timeout 3”,但是您将系统命令的参数分为两部分,一个是“bcedit.exe”,另一个是“ /超时 3"。我认为你应该写这个

system("bcdedit.exe /timeout 3");

运行你想要的命令。希望这会对你有所帮助

于 2012-05-31T12:42:32.280 回答