VBscript wscript.shell выполнить не обновляя в winpe
У меня есть 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
вывод отличается, потому что он имеет только одну строку, которая обновляет себя, но я не уверен, как кодировать его.
1 ответ
Я не знаю как dism.exe
выводит данные (на данный момент у меня есть только XP для тестирования), но есть как минимум два случая, когда код
Set objExec = objShell.Exec( ...... )
Do
WScript.StdOut.WriteLine(objExec.StdOut.ReadLine())
Loop While Not objExec.Stdout.atEndOfStream
не будет работать, как ожидалось.
Один из них - когда выходные данные программы напрямую отправляются в буфер консоли, а не записываются в стандартный вывод. Как код читает из stdout
поток дочернего процесса и на нем ничего нет....
Во-вторых, когда в выводе дочернего процесса нет конца строки. И то и другое Read
а также ReadLine
вернуться, когда нажата клавиша Enter или когда CRLF
внутри содержимого читается. Но типичная форма генерации индикатора выполнения в выводе консоли не отправляет LF
часть, отправив только CR
вернуть каретку в начало строки и вывести следующее изменение в индикаторе выполнения, просто записав поверх первого нарисованного. В этом случае оба указанных метода не вернутся, пока не появится CRLF
включен в выходной поток дочернего процесса или поток закрыт.
Как уже говорилось, у меня нет доступа к DISM для тестирования, но, похоже, он попадет в один из двух случаев.
И нет, похоже Run
Метод не может выполнить команду в том же окне.
Если "одно и то же окно" является обязательным требованием, лучше использовать код
- запустить "главный" пакетный файл
- этот пакетный файл запускает VBS
- VBS делает то, что ему нужно, и в случае выполнения DISM или чего-то подобного генерирует временный пакетный файл с адекватным содержимым и выходит из VBS.
- "главный" пакетный файл извлекает элемент управления, проверяет наличие временного пакетного файла и вызывает его
- по завершении временного командного файла "мастер" извлекает элемент управления и снова запускает VBS
- используйте метод, который лучше адаптируется (аргументы, переменные среды, файлы флагов,...), чтобы определить, что это не первое выполнение, и продолжайте выполнение по мере необходимости.