从shellexecute中的cmd命令捕获errorlevel

时间:2018-06-05 15:46:19

标签: winapi visual-c++ cmd mfc

我有批处理脚本,在工作网络上创建大约30个位置的备份,并且它可以工作。 现在我正在编写相同的应用程序,但是在MFC VC ++中,所以我使用小技巧在字符串中为xcopy设置参数,然后使用ShellExecute执行它。

m_destination在编辑框中是变量,作为目标输入,文件在哪里。

代码是:

if (m_line1.GetCheck() == BST_CHECKED)
{
    temp_dest = _T("/min /c xcopy \"\\\\pc_name.sub_domain.domain.local\\c$\\Users\\Test\\Desktop\\Test\\*.*\" \"") + m_destination + _T("\" /Y /E /Q");
    ShellExecute(
        GetSafeHwnd(),
        L"open",            // open edit print
        L"C:\\Windows\\System32\\cmd.exe", // FILE PATH,  
        temp_dest,          // PARAMETERS
        NULL,               // WORKING DIR
        SW_HIDE);           // WINDOW SHOW HIDE
    m_status = "Line 1 - OK\r\n";
}

上面的代码可行,但在某些情况下,当目标PC关闭时,在cmd窗口中,它表示“路径已更改或目标无法访问”(类似的情况)。在这种情况下,%errorlevel%有一些值,如果复制成功则有一些其他值。然后你有条件触发不同的警告给用户。 问题是,我不知道如何抓住它来表示不成功的复制。

我需要某种警告,不要从那台电脑上复制。如何以这种方式复制后检索错误代码?

或者如果有简单的功能来替换copyx与(*。*)(所有内容)复制,能够被定向到特定目录,我想听听它。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我不认为使用ShellExecute这是一种直截了当的方法,因为它没有为您提供流程处理。但是,ShellExecuteEx通过您传入的SHELLEXECUTEINFO structhProcess字段执行。使用该句柄,您可以等待(WaitForSingleObject),然后获取退出代码({ {3}})。但是,您也可以使用简单的GetExitCodeProcess执行此操作。此外,CreateProcess支持一些类似xcopy的操作,并为您提供额外的编程控制。