首先我必须说,从可执行文件运行批处理文件只是为了复制文件太笨拙且效率低下。复制文件的API有很多,不然xcopy或copy怎么办?您只需要拨打适当的电话,例如CopyFile 或CopyFileExW。在从可执行文件运行任何外部命令之前,请始终在 MSDN 中搜索 API,总有更好的解决方案
见How can I copy and paste a file in Windows using C++?
回到问题,那是因为file system redirector。如果您将程序编译为 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