【问题标题】:Run batch file from VC++从 VC++ 运行批处理文件
【发布时间】:2013-09-27 06:50:59
【问题描述】:

我正在尝试通过使用ShellExecute 运行批处理文件将文件从 VC++ 复制到C:\Windows\System32...,这就是我的批处理文件运行的内容

xcopy /S/E "source" "C:\Windows\System32\test.dll" /y

问题是当我从 VC++ 运行这个批处理文件时,它会被复制到C:\Windows\SysWOW64,但是当我双击批处理文件时,它会复制到我想要的位置C:\Windows\System32...

我应该怎么做才能让它从 VC++ 复制到System32

【问题讨论】:

    标签: visual-c++ batch-file


    【解决方案1】:

    首先我必须说,从可执行文件运行批处理文件只是为了复制文件太笨拙且效率低下。复制文件的API有很多,不然xcopycopy怎么办?您只需要拨打适当的电话,例如CopyFileCopyFileExW。在从可执行文件运行任何外部命令之前,请始终在 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
    

    【讨论】:

    • 谢谢,但是从 vc 运行时它不起作用。我就是这样写的.. system("cmd /c xcopy \"source\" \"C:\Windows\System32\test.dll*\" /y");
    • 如果你使用 system() 那么system("xcopy \"source\" \"C:\Windows\System32\test.dll*\" /y"); 就足够了。否则你应该运行system("cmd.exe /c xcopy \"source\" \"C:\Windows\System32\test.dll*\" /y");
    • 我都试过了,并尝试运行 32 位和 64 位 cmd。但它只会复制到 SysWow64...
    • 你应该指定正确的 cmd.exe 和文件夹路径,就像我刚刚编辑的那样
    【解决方案2】:

    检查两个重要方面:

    • 您应用的是 32 位还是 64 位进程?
    • 当前目录

    还要确保您可能需要注释掉 REM 标记的行,处理环境变量等。

    【讨论】:

    • 谢谢,但是如何检查我的应用程序是否是 32/64 位的?目录没问题。
    • 只有 32 位程序才能在这样的重定向下运行。 @Terrence:在调试/发布选项右侧检查VS中的架构编译选项
    猜你喜欢
    • 1970-01-01
    • 2012-12-18
    • 2011-10-29
    • 2012-08-07
    • 2011-02-07
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多