Winapi 从shellexecute中的cmd命令捕获errorlevel
我有一个批处理脚本,用于创建工作网络上大约30个位置的备份,它可以正常工作。 现在我正在用MFC VC++编写同一个应用程序,所以我使用小技巧以字符串形式为xcopy设置参数,然后用Winapi 从shellexecute中的cmd命令捕获errorlevel,winapi,visual-c++,cmd,mfc,Winapi,Visual C++,Cmd,Mfc,我有一个批处理脚本,用于创建工作网络上大约30个位置的备份,它可以正常工作。 现在我正在用MFC VC++编写同一个应用程序,所以我使用小技巧以字符串形式为xcopy设置参数,然后用ShellExecute执行它 m_destination是editbox中的变量,作为文件的目的地输入 代码是: if (m_line1.GetCheck() == BST_CHECKED) { temp_dest = _T("/min /c xcopy \"\\\\pc_name.sub_domain.d
ShellExecute
执行它
m_destination
是editbox中的变量,作为文件的目的地输入
代码是:
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,并且能够定向到特定的目录,我想听听这个
提前感谢。我不认为有一种简单的方法可以使用
ShellExecute
实现这一点,因为它没有给您一个进程句柄。但是,通过传入的hProcess
字段。使用该句柄,您可以等待()然后获取退出代码()。但是,您也可以通过一个简单的。还支持一些类似xcopy的操作,并为您提供额外的编程控制。尝试SHFileOperation
Google“createprocess waitforsingleobject getexitcodeprocess”。使用批处理似乎有点古怪,因为您正在编程,所以请从程序中复制。万一有人正在阅读,我已经设法解决了它。。。要检测它是否复制了所有内容,请执行以下操作<代码>LPTSTR临时目的地2=(LPTSTR)(LPCTSTR)临时目的地;BOOL bSucess=CreateProcess(L“C:\\Windows\\System32\\cmd.exe”,temp\u dest2,NULL,NULL,FALSE,CREATE\u DEFAULT\u ERROR\u MODE,NULL,NULL,&sinfo,&pinfo);终止进程(pinfo.hProcess,2);GetExitCodeProcess(pinfo.hProcess和dwCode);TCHAR-msg2[100];StringCbPrintf(msg2,100,文本(“%X”),dwCode);消息框(msg2,(LPCWSTR)L“DWCode 2”,MB|U OK | MB|U ICON错误)@zett42 thank you ERRORLEVEL和process exit code是两个不同的东西。我不认为命令解释器的exit code设置为ERRORLEVEL
,因此使用ShellExecuteEx
代替ShellExecute
不会给您带来任何好处。@IInspectable True。不过,如果文章完全显示了OP的意图,OP实际上不需要使用cmd.exe。他们可以在xcopy.exe上直接使用CREATE\u NO\u窗口
标志CreateProcess
。当然可以,但这个答案意味着将shellexecutex
交换为ShellExecuteEx
就足够了。这需要澄清。使用ShellExecuteEx
启动进程也是非常罕见的。它需要环境设置才能正常工作CreateProcess
不会,也不会对可以从中调用它的线程施加任何限制。