Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBscript wscript.shell在winpe中执行时不刷新_Vbscript_Wsh_Winpe_Dism - Fatal编程技术网

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

VBscript wscript.shell在winpe中执行时不刷新,vbscript,wsh,winpe,dism,Vbscript,Wsh,Winpe,Dism,我有一个基于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:" &

我有一个基于
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
此执行方式存在两个问题:

  • 执行似乎停止了,我必须按enter键才能继续
  • 第二个问题是进度条不显示。它停留在“应用图像”
  • 通常,如果执行
    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
    输出是不同的,因为它只有一行刷新自己,但我不确定如何对其进行编码。

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

    Set objExec = objShell.Exec( ...... )
    Do
        WScript.StdOut.WriteLine(objExec.StdOut.ReadLine())
    Loop While Not objExec.Stdout.atEndOfStream
    
    将无法按预期工作

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

    第二种情况是在子进程输出中没有行尾标记。
    Read
    ReadLine
    在按下回车键或
    CRLF
    正在读取内容时返回。但是,在控制台输出中生成进度条的典型形式不是发送
    LF
    部分,而是只发送e> CR将插入符号返回到行的开头,并输出下一个进度条中的更改(仅写入第一个绘制的进度条)。在这种情况下,两个指定的方法都不会返回,直到子进程的输出流中包含
    CRLF
    或流关闭

    如前所述,我无法访问DISM进行测试,但它似乎将落在两种情况之一中

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

    如果“同一窗口”是一个强制性要求,那么更好的方法是编写如下代码

    • 启动“主”批处理文件
    • 此批处理文件启动vbs
    • vbs执行它需要执行的操作,如果必须执行DISM或任何类似操作,则生成一个包含特定内容的临时批处理文件,然后退出vbs
    • “主”批处理文件检索控件,检查是否存在临时批处理文件并调用它
    • 完成临时批处理文件后,“主”将检索控件并再次启动vbs
    • 使用更适合的方法(参数、环境变量、标志文件等)确定这不是第一次执行,并根据需要继续执行

    切换到wscript.shell运行,它正确显示了进度,但它似乎只想在新命令窗口中打开。这并不是我想要的,我将保留此问题,以防有人建议将进度条保留在同一命令窗口中。新代码如下所示
    WshShell.run“DISM.exe/Apply Image/ImageFile:i:\images\wim\”&name&“/index:1/ApplyDir:c:\”,1,true