bcdedit 文件输出不起作用,但其他命令可以
bcdedit file output doesn't work but other commands do
我在执行命令行时遇到了一个非常奇怪的问题。下面的代码工作没有问题:
ShellExecute(NULL, "open", "cmd.exe", "/C ipconfig > file_output.txt", NULL, SW_SHOWNORMAL);
执行时,ipconfig 输出被写入 file_output.txt",这正是我想要的。但是,当我使用 bcdedit 时:
ShellExecute(NULL, "open", "cmd.exe", "/C bcdedit > file_output.txt", NULL, SW_SHOWNORMAL);
文件已生成,但文件中没有任何内容。我可以在cmd中执行相同的命令.exe作为管理员并且可以工作。我也试过:
ShellExecute(NULL, "open", "cmd.exe", "/C bcdedit /enum all > file_output.txt", NULL, SW_SHOWNORMAL);
bcdedit 没有任何工作。没有错误。以下是我尝试过的其他几种方法:
- 请改用 CreateProcess。
- 改用系统。
- 将目录设置为 C:\Windows\System32
- 将目录设置为 C:\Windows\SysWOW64\
同样,在cmd.exe中执行相同的命令是有效的,但它似乎在我的代码中不起作用。我整天都在搜索,似乎找不到有效的东西。有什么想法吗?
编辑:经过进一步调试,现在我看到以下命令。
"bcdedit"不被识别为内部或外部命令、可操作程序或批处理文件。
'C:\Windows\System32\bcdedit.exe' 不被识别为内部或外部 c ommand,可操作的程序或批处理文件。
我再次尝试了上面列出的所有 4 种方法,但显然仍然无法将其识别为命令。 **bcdedit.exe 实际上存在于 C:\Windows\System32** 中。
这是文件系统重定向对在 64 位窗口上运行的 32 位进程的影响。
在 64 位窗口中,每当 32 位应用程序尝试访问%windir%System32
目录时,访问将被重定向到%windir%SysWOW64
。此过程对应用程序是透明的,它仍然认为它正在访问%windir%System32
目录。
因此,当您的 32 位应用程序调用cmd.exe
时,它实际上是在调用驻留在%windir%SysWOW64
中的 32 位版本的cmd.exe
。32 位版本的cmd.exe
反过来尝试从SysWOW64
direcory 调用bcdedit.exe
,但%windir%SysWOW64
中不存在 32 位版本的bcdedit.exe
,它只存在于 32 位cmd.exe
无法访问的%windir%System32
中。
若要获取有关文件系统重定向程序的详细信息,可以参阅 MSDN 页,网址为 https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85(.aspx
解决此问题的最便捷方法是将应用编译为 64 位可执行文件,以便在 64 位窗口上运行。
但是,如果您有特定需求仅保持应用程序 32 位,或者如果您希望有一个可以在 32 位和 64 位系统上运行的可执行文件,则可以暂时禁用文件系统重定向器,以便能够在 64 位窗口上运行 64 位版本的cmd.exe
。有关如何执行此操作的信息可以在上面发布的链接中找到。
但通常不建议这样做,它需要通过对主题的理解,并且有可能产生比解决更多的问题。
如果需要 32 位和 64 位窗口的单个可执行文件,则替代方法是生成 32 位和 64 位版本的应用,并将 64 位可执行文件作为资源嵌入到 32 位版本中。然后,32 位应用程序可以检测它是在 32 位还是 64 位窗口下运行,因此它将继续运行或将 64 位可执行文件提取到临时位置以运行该窗口。
好的。我认为您的应用程序以管理员身份运行,但ShellExecute
命令不是。 为此,我相信您需要向runas
而不是open
提出第二个论点。喜欢这个:
ShellExecute(NULL, "runas", "cmd.exe", "/C bcdedit > file_output.txt", NULL, SW_SHOWNORMAL);
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 从命令行c++发送文本文件名
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 使用QProcess执行命令,并将结果存储在QStringList中
- 数组长度,为什么从命令行获取时不能使用它?
- 在其他文件中创建类时在 c++ 项目中不起作用
- bcdedit 文件输出不起作用,但其他命令可以
- 是否有一个WinAPI可以从带有可选空格和其他参数的命令行获取文件名
- 如何从其他命令行接口程序获得输出
- 我可以在启动程序时从命令行重定向其他文件描述符吗?
- cc1plus:无法识别的命令行选项警告任何其他警告
- 从popen执行命令shell并设置其他命令shell
- PIN工具是否可以插入一个bash脚本,其中包含运行其他命令的代码
- 是否有可能在C中使用系统api启动一个kill命令?如果没有其他选择的话