我在WinPE中使用基于DISM
的成像解决方案,如下所示:
set WshShell = CreateObject("WScript.Shell")
Wscript.StdOut.WriteLine "[44m[1;37m restoring image boot partition for " & name & " [0m[40m"
Set objExec = WshShell.Exec("DISM.exe /Apply-Image /ImageFile:" & name & "/index:1 /ApplyDir:c:\")
Do
line = objExec.StdOut.ReadLine()
Wscript.StdOut.WriteLine line
Loop While Not objExec.Stdout.atEndOfStream
执行方式有两个问题:
通常,如果你执行DISM.exe /Apply-Image /ImageFile:" & name & "/index:1 /ApplyDir:c:\
,它将看起来像这样:
"申请图片{1%-------------------------------------}
有趣的是,准备磁盘的这个部分显示了每一行执行:
Set WshShell = CreateObject("WScript.Shell")
Set objExec = WshShell.Exec("diskpart.exe /s clean.sh")
Do
line = objExec.StdOut.ReadLine()
Wscript.StdOut.WriteLine line
Loop While Not objExec.Stdout.atEndOfStream
我认为DISM
输出不同,因为它只有一行可以刷新,但我不知道如何编写它。
答案 0 :(得分:0)
我不知道dism.exe
如何输出数据(目前我只有XP进行测试)但至少有两种情况,其中代码为
Set objExec = objShell.Exec( ...... )
Do
WScript.StdOut.WriteLine(objExec.StdOut.ReadLine())
Loop While Not objExec.Stdout.atEndOfStream
无法按预期工作。
一种是程序输出直接发送到控制台缓冲区,而不是写入stdout。由于代码从子进程的stdout
流中读取,并且没有任何内容......
其次是子进程输出中没有行标记结束时。当按下 Enter 键或者正在读取内容中Read
时,ReadLine
和CRLF
都会返回。但是,在控制台输出中生成进度条的典型形式是不发送LF
部分,仅发送CR
以将插入符号返回到行的开头并输出下一个正在进行的更改只是写在第一个绘制的一个。在这种情况下,在子进程的输出流中包含CRLF
或流被关闭之前,两个指示的方法都不会返回。
如上所述,我无法访问DISM进行测试,但似乎它会落入两种情况之一。
不,似乎Run
方法无法在同一窗口中运行该命令。
如果“同一窗口”是强制性要求,则更好的方法是编写类似
的代码