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

T.T*_*.T. 6 c++ windows winapi

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
Run Code Online (Sandbox Code Playgroud)

.
.

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

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

"The arguments you specified for this command are not valid"
Run Code Online (Sandbox Code Playgroud)

..

现在,为了让事情变得更有趣:
如果第二次从CreateProcess()再次执行脚本(给定磁盘现在被转换并且它为转换comamnds 提供了正确的错误),当它到达时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 ) );
Run Code Online (Sandbox Code Playgroud)

结束原始问题_________________________________________________________

编辑:
更新和更多信息:

  • 在创建卷命令之前添加了大约15 - 20秒的延迟,仍然得到相同的错误消息.

  • 此外,将工作拆分为两个脚本,两次调用CreateProcess().在第二个脚本,只是调用"创建卷"并分配,它挂了一段时间,然后回来了"此命令无法在此时完成"..或者其他效果.

  • 另外需要注意的是:在第一个脚本中,将它们置于动态状态,与使用命令提示符运行相比,它的运行速度要慢一倍.

也许应该只运行整个事情两次(第二次运行时出错),因为它确实有效

EDIT2
2个脚本现在正在工作,或者在我再次尝试时工作.不知道为什么它第一次不起作用.

jan*_*anm 4

create volume因为您的脚本第二次工作,所以最可能的原因似乎是与时间相关——执行命令时卷尚未准备好。

基于该假设:

可以在命令detail disk前添加一条命令create volume来查看磁盘的状态。这将告诉您有关磁盘当前状态的信息。如果磁盘 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
Run Code Online (Sandbox Code Playgroud)