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

Есть две проблемы с тем, как это выполняется:

  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 вывод отличается, потому что он имеет только одну строку, которая обновляет себя, но я не уверен, как кодировать его.

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
  • используйте метод, который лучше адаптируется (аргументы, переменные среды, файлы флагов,...), чтобы определить, что это не первое выполнение, и продолжайте выполнение по мере необходимости.
Другие вопросы по тегам