首先我必须说,从可执行文件运行批处理文件只是为了复制文件太笨拙且效率低下。复制文件的 API 有很多,否则怎么xcopy
做copy
?您只需要调用适当的类似CopyFile
或CopyFileExW
。在从可执行文件运行任何外部命令之前,请始终在 MSDN 中搜索 API,总有更好的解决方案
请参阅如何使用 C++ 在 Windows 中复制和粘贴文件?
回到问题,那是因为文件系统重定向器。如果您将程序编译为 32 位,那么该 *.bat 文件将在 32 位 cmd.exe 中运行。但是当您双击它时,将执行 64 位 cmd.exe,这就是为什么您会看到这样的结果。
如果您不需要支持 32 位平台,您可以将程序编译为 64 位。如果您必须将程序编译为 32 位,则需要禁用 MS 网站上提到的文件系统重定向,或使用%windir%\SysNative
但不需要像那样运行批处理文件,直接从 cmd.exe 运行即可。以下命令
cmd /c xcopy /S/E "source" "C:\Windows\System32\test.dll*" /y
将在/c
. 确保运行正确的 32 位或 64 位版本的 cmd
在 32 位程序中,如果您不禁用文件系统重定向,那么您需要使用正确的文件夹运行正确版本的 cmd.exe。使用以下命令运行 32 位 cmd.exe
system("cmd.exe /c xcopy /S/E \"source\" \"%windir%\\Sysnative\\test.dll*\" /y"); // or
system(R"(cmd.exe /c xcopy /S/E "source" "%windir%\Sysnative\test.dll*" /y)")
或以下运行 64 位 cmd
system("%windir%\\Sysnative\\cmd.exe /c xcopy /S/E \"source\" \"%windir%\\System32\\test.dll*\" /y"); // or
system(R"(%windir%\Sysnative\cmd.exe /c xcopy /S/E "source" "%windir%\System32\test.dll*" /y)");
最简单的方法是将项目更改为 64 位并正常运行
system("xcopy /S/E \"source\" \"%windir%\\System32\\test.dll*\" /y"); // or