VBscript wscript.shell在winpe中执行不刷新

时间:2014-01-04 16:05:30

标签: vbscript wsh winpe dism

我在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

执行方式有两个问题:

  1. 执行似乎停滞不前,我必须按Enter才能继续。
  2. 第二个问题是进度条没有显示。它停留在"应用图像"。
  3. 通常,如果你执行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输出不同,因为它只有一行可以刷新,但我不知道如何编写它。

1 个答案:

答案 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时,ReadLineCRLF都会返回。但是,在控制台输出中生成进度条的典型形式是不发送LF部分,仅发送CR以将插入符号返回到行的开头并输出下一个正在进行的更改只是写在第一个绘制的一个。在这种情况下,在子进程的输出流中包含CRLF或流被关闭之前,两个指示的方法都不会返回。

如上所述,我无法访问DISM进行测试,但似乎它会落入两种情况之一。

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

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

的代码
  • 启动“主”批处理文件
  • 此批处理文件启动vbs
  • vbs执行它需要做的事情,并且在必须执行DISM或类似操作的情况下,生成具有相关内容的临时批处理文件并退出vbs
  • “master”批处理文件检索控件,检查是否存在临时批处理文件并将其调用
  • 完成临时批处理文件后,“master”检索控件并再次启动vbs
  • 使用更好地适应的方法(参数,环境变量,标志文件......)来确定这不是第一次执行并继续执行。