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
此执行方式存在两个问题:
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
部分,而是只发送CRLF
或流关闭
如前所述,我无法访问DISM进行测试,但它似乎将落在两种情况之一中
不,似乎Run
方法无法在同一窗口中运行该命令
如果“同一窗口”是一个强制性要求,那么更好的方法是编写如下代码
- 启动“主”批处理文件
- 此批处理文件启动vbs
- vbs执行它需要执行的操作,如果必须执行DISM或任何类似操作,则生成一个包含特定内容的临时批处理文件,然后退出vbs
- “主”批处理文件检索控件,检查是否存在临时批处理文件并调用它
- 完成临时批处理文件后,“主”将检索控件并再次启动vbs
- 使用更适合的方法(参数、环境变量、标志文件等)确定这不是第一次执行,并根据需要继续执行
WshShell.run“DISM.exe/Apply Image/ImageFile:i:\images\wim\”&name&“/index:1/ApplyDir:c:\”,1,true