0

我有一个DISM用于 WinPE 的基于成像的解决方案,如下所示:

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

它的执行方式有两个问题:

  1. 执行似乎停止了,我必须按 Enter 才能继续。
  2. 第二个问题是进度条不显示。它停留在“应用图像”。

通常,如果您执行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输出是不同的,因为它只有一行可以自我刷新,但我不确定如何围绕它编写代码。

4

1 回答 1

0

我不知道如何dism.exe输出数据(目前我只有一个 XP 来测试)但至少有两种情况下代码为

Set objExec = objShell.Exec( ...... )
Do
    WScript.StdOut.WriteLine(objExec.StdOut.ReadLine())
Loop While Not objExec.Stdout.atEndOfStream

不会按预期工作。

一种是程序输出直接发送到控制台缓冲区,而不是写入标准输出。由于代码从子进程流中读取stdout并且上面没有任何内容......

其次是子进程输出中没有行尾标记时。当按键被按下或 a在内容被读取时,两者都Read返回ReadLine。但是,在控制台输出中生成进度条的典型形式是不发送部分,仅发送以将插入符号返回到行首并输出进度条中的下一个更改,只是覆盖第一个绘制的。在这种情况下,两个指示的方法都不会返回,直到子进程的输出流中包含一个或流被关闭。EnterCRLFLFCRCRLF

如前所述,我无法访问 DISM 进行测试,但它似乎属于这两种情况之一。

不,似乎Run方法无法在同一窗口中运行命令。

如果“相同窗口”是强制性要求,更好的方法是编写类似的代码

  • 启动一个“主”批处理文件
  • 这个批处理文件启动 vbs
  • vbs 做它需要做的事情,在必须执行 DISM 或类似的情况下,生成一个包含适当内容的临时批处理文件并退出 vbs
  • “主”批处理文件检索控件,检查临时批处理文件的存在并调用它
  • 临时批处理文件完成后,“master”检索控件并再次启动 vbs
  • 使用更好适应的方法(参数,环境变量,标志文件,...)确定这不是第一次执行并根据需要继续执行。
于 2014-01-05T15:15:12.813 回答