经过测试,得知diskpart并不像cmd那样支持使用&来执行多条指令,如果单纯的想使用&,例如
QString strAttachCmd = "select vdisk file=d:\\test\\test.vhd \
& attach vdisk \
& exit";
HINSTANCE hresult = ShellExecuteA(NULL, "open", "diskpart.exe", strAttachCmd.toLocal8Bit().constData(), NULL, SW_HIDE);
是注定失败的。
需要使用bat批处理的方式来。例如想实现上面的功能,可以创建一个attachvhd.bat和attachvhd.txt
attachvhd.bat内容为:
diskpart /s attachvhd.txt
attachvhd.txt内容为:
select vdisk file="d:\\test\\test.vhd"
attach vdisk
exit
注意路径和名称不要错误了。然后双击运行attachvhd.bat即可。
关于在c++中调用bat,参考以下网站:
https://blog.csdn.net/lwx309025167/article/details/78282114
https://blog.csdn.net/jeakon/article/details/8544964
https://blog.csdn.net/oilcode/article/details/50320147
避免网站打不开,总结以下:
方法1、system("attachvhd.bat"); system是C标准库中的函数。
方法2、WinExec("attachvhd.bat", SW_HIDE); WinExec是 Windows.h 中的函数。
方法3、
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
if (CreateProcess(L"RUN_TEST.bat",// RUN_TEST.bat位于工程所在目录下
NULL,
NULL,
NULL,
FALSE,
CREATE_NO_WINDOW,// 这里不为该进程创建一个控制台窗口
NULL,
NULL,
&si, &pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);// 等待bat执行结束
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}