从CreateProcess()执行时,diskpart不会正确处理脚本

diskpart“myScript.txt”:

select disk 1 convert dynamic noerr select disk 2 convert dynamic noerr create volume stripe disk=1,2 noerr assign letter=X noerr 


从命令提示符运行时: diskpart /s myScript.txt 按预期工作

但是 ,使用win api的CreateProcess()运行时,转换命令都可以正常工作,
create volume ,它显示:

 "The arguments you specified for this command are not valid" 

。 。

现在,让事情变得更有趣:
如果第二次从CreateProcess() 再次执行该脚本 (因为现在磁盘已经转换,并且它为转换文件提供了正确的错误 ),所以当它到达create volume它确实起作用。

这使我认为它与磁盘和/或可执行文件有关吗?

任何点在正确的方向是赞赏,因为这是非常混乱。 谢谢。

 STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); ZeroMemory(&pi, sizeof(pi)); si.cb = sizeof(si); strncpy( command, "diskpart.exe /s myScript.txt", (sizeof(command) - 1) ); CreateProcess( "c:\\WINDOWS\\system32\\diskpart.exe", command, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi ) ); 

最后的原始问题_________________________________________________________

编辑:
更新和更多信息:

  • 在创build卷命令之前增加了大约15-20秒的延迟时间,仍然得到相同的错误信息。

  • 另外,将工作分成两个脚本,两个调用CreateProcess()。 在第二个脚本,只是调用“创build卷”和分配,它挂了一段时间,然后回来了“这个命令不能在这个时候完成”..或什么的效果。

  • 另外需要注意的是:在第一个脚本中,将它们设置为dynamic的,与使用命令提示符运行相比,运行速度要慢两倍左右。

也许应该运行整个事情两次(第二次运行的错误),因为这样做的工作

EDIT2
这两个脚本现在正在工作,或者当我再次尝试时工作。 不知道为什么它第一次没有工作。

由于您的脚本第二次运行,似乎最有可能的原因是与时间有关 – create volume命令执行时,卷尚未准备好。

基于这一假设:

您可以在create volume命令之前添加一个detail disk命令来查找磁盘的状态。 这会告诉你关于磁盘当前状态的一些信息。 如果磁盘2不显示任何有趣的内容,请选择第一个磁盘以显示其详细信息。 你从这里得到的信息可能会有所帮助。

至于实际解决问题,通过在线和离线进行磁盘引入延迟可能有所帮助。 例如:

 select disk 1 convert dynamic select disk 2 convert dynamic select disk 1 offline disk select disk 2 offline disk select disk 1 online disk select disk 2 online disk create volume stripe disk=1,2 assign letter=X 

这是http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx关于第一个参数所说的摘录:

lpApplicationName参数可以是NULL。 在这种情况下,模块名称必须是lpCommandLine字符串中的第一个以空格分隔的标记。

如果可执行模块是16位应用程序,则lpApplicationName应该为NULL,并且由lpCommandLine指向的字符串应指定可执行模块及其参数。

 given the above, Suggest: (first, assure command[] buffer is plenty large enough for the following) (may have to add the path for the 'myStript.txt) (may be necessary to add some wait time before calling CreateProcess() to assure the prior commands have completed. strncpy( command, "c:\\Windows\\System32\\diskpart.exe /s myScript.txt", (sizeof(command) - 1) ); CreateProcess( NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi ) ); 

由于这可能是计时问题,因此您应该确保在继续在父程序中继续之前正确等待diskpart命令的结束。

当我想模拟cmd.exe处理时,我总是在CreateProcess之后使用WaitForSingleObject

 CreateProcess(NULL, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); WaitForSingleObject(pi.hProcess, INFINITE); 

这个序列更接近旧的system功能…