【问题标题】:Catch errorlevel from cmd command in shellexecute从 shellexecute 中的 cmd 命令捕获错误级别
【发布时间】:2018-06-05 15:46:19
【问题描述】:

我有批处理脚本,可以在工作网络上创建大约 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% 有一些价值,如果复制成功完成,还有一些其他价值。然后你有条件向用户触发不同的警告。 问题是,我不知道如何捕捉它以指示复制不成功。

我需要某种警告,说明从那台 PC 进行的复制尚未完成。这样复制后如何找回错误码?

或者,如果有简单的功能可以将 copyx 替换为 (*.*)(所有内容)复制,并且能够定向到特定目录,我想听听。

提前致谢。

【问题讨论】:

  • 试试SHFileOperation
  • 谷歌“createprocess waitforsingleobject getexitcodeprocess”。
  • 使用批处理似乎有点不稳定,因为您正在编程,请从您的程序中复制。
  • 以防万一有人在阅读,我已经设法解决它...检测它是否全部复制...LPTSTR temp_dest2 = (LPTSTR)(LPCTSTR)temp_dest;BOOL bSucess = CreateProcess(L"C:\\Windows\\System32\\cmd.exe", temp_dest2, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &sinfo, &pinfo); TerminateProcess(pinfo.hProcess, 2); GetExitCodeProcess(pinfo.hProcess, &dwCode); TCHAR msg2[100]; StringCbPrintf(msg2, 100, TEXT("%X"), dwCode); MessageBox(msg2, (LPCWSTR)L"DWCode 2", MB_OK | MB_ICONERROR);@zett42 谢谢
  • ERRORLEVEL 和进程退出代码是两个不同的东西。

标签: winapi visual-c++ cmd mfc


【解决方案1】:

我认为ShellExecute 没有直接的方法可以做到这一点,因为它没有为您提供进程句柄。但是,ShellExecuteEx 确实可以通过您传入的 SHELLEXECUTEINFO struct 的 hProcess 字段。使用该句柄,您可以等待 (WaitForSingleObject) 然后获取退出代码 (GetExitCodeProcess)。但是,您也可以使用简单的CreateProcess 来执行此操作。 SHFileOperation 还支持一些类似 xcopy 的操作,并为您提供额外的编程控制。

【讨论】:

  • 我不认为命令解释器的退出代码设置为ERRORLEVEL,所以使用ShellExecuteEx 代替ShellExecute 不会给你带来任何好处。
  • @IInspectable 真。但是,如果帖子完全显示了他们正在尝试做的事情,OP 实际上并不需要使用 cmd.exe。他们可以直接使用CREATE_NO_WINDOW 标志在xcopy.exe 上CreateProcess。
  • 是的,当然,但这个答案意味着用ShellExecute 交换ShellExecuteEx 就足够了。这需要澄清。使用ShellExecuteEx 来启动进程也是非常不寻常的。它需要环境设置才能正常运行。 CreateProcess 没有,并且对可以调用它的线程没有任何限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
相关资源
最近更新 更多