Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 从shellexecute中的cmd命令捕获errorlevel_Winapi_Visual C++_Cmd_Mfc - Fatal编程技术网

Winapi 从shellexecute中的cmd命令捕获errorlevel

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

我有一个批处理脚本,用于创建工作网络上大约30个位置的备份,它可以正常工作。 现在我正在用MFC VC++编写同一个应用程序,所以我使用小技巧以字符串形式为xcopy设置参数,然后用
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
不会,也不会对可以从中调用它的线程施加任何限制。