1

Тема: VBScript: консольный индикатор прогресса и подобные приёмы

Автор примера - alexii, принимали участие - wisgest и The gray Cardinal.
См. подробные комментарии в коде.

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objWshShell = WScript.CreateObject("WScript.Shell")


' Для того, чтобы отсечь возможное перенаправление вывода, например, при
' [cscript.exe //nologo SampleConsoleIndicator.vbs > SamplePiping.txt],
' следует осуществлять запись на устройство CON.
' При этом вывод WScript.Echo, WScript.StdOut.Write, objFSO.GetStandardStream(1).Write
' будет перенаправлен в файл SamplePiping.txt, а objFSO.CreateTextFile("CON").Write — нет.

Set objTSConsole = objFSO.CreateTextFile("CON")


' Когда длина текста сообщения постоянна, можно использовать BS (BackSpace — символ с кодом 0x08).
' При выводе символа с кодом 0x08 на консоль происходит перемещение курсора на символ влево.

intLenght = 4
strRepeatingText = "Process completing..."

WScript.Echo
WScript.Echo "Process start"

objTSConsole.Write strRepeatingText & String(intLenght, " ")

For intIndicator = 0 To 100
    objTSConsole.Write String(intLenght, Chr(8))
    objTSConsole.Write Right(String(intLenght, " ") & CStr(intIndicator), intLenght - 1) & "%"
    
    ' Вместо этого что-то делаем…
    WScript.Sleep 20
Next

WScript.Sleep 1000
objTSConsole.WriteLine

WScript.Echo "Process finished"
WScript.Sleep 3000


' Когда длина текста сообщения непостоянна (например, имена папок или файлов),
' чтобы не отслеживать меняющуюся длину можно использовать CarriageReturn (CR — символ с кодом 0x13).
' При выводе символа с кодом 0x13 на консоль происходит перемещение курсора в начало строки.
' Чтобы затереть предыдущий текст в строке, нужно перевести курсор в начало строки, а затем вывести
' необходимое число пробелов, затем опять перевести курсор в начало строки и только после этого
' выводить сообщение.

strRepeatingText = "Processing: "

WScript.Echo
WScript.Echo "Process start"

For Each objFolder In objFSO.GetFolder(objWshShell.ExpandEnvironmentStrings("%ProgramFiles%")).SubFolders
    ' Выводим постоянную часть сообщения и достаточное количество пробелов.
    objTSConsole.Write Chr(13) & strRepeatingText & String(50, " ")
    objTSConsole.Write Chr(13) & strRepeatingText & objFolder.Name
    
    ' Вместо этого что-то делаем…
    WScript.Sleep 300
Next

WScript.Sleep 1000
objTSConsole.WriteLine

WScript.Echo "Process finished"
WScript.Sleep 3000


' Важный момент: оба метода работают в пределах одной строки. Если длина текста сообщения
' превысит ширину окна консоли и произойдёт перенос текста на следующую строку, то
' оба метода, рассмотренные выше, будут работать с этой следующей строкой.
' Чтобы посмотреть размеры окна консоли по умолчанию, раскомментируйте следующие строки.
' 
'Dim intConsoleWindowSize
'
'On Error Resume Next
'intConsoleWindowSize = objWshShell.RegRead("HKEY_CURRENT_USER\Console\WindowSize")
'
'If Err.Number = 0 Then
'    WScript.Echo "Size of console window: " & _
'        intConsoleWindowSize Mod &H10000 & "x" & intConsoleWindowSize \ &H10000
'Else
'    Err.Clear
'    WScript.Echo "Can't get size of console window: error reading registry key " & _
'        "[HKEY_CURRENT_USER\Console\WindowSize]"
'End If
'
'On Error Goto 0

objTSConsole.Close

Set objTSConsole = Nothing
Set objWshShell = Nothing
Set objFolder = Nothing
Set objFSO = Nothing

WScript.Quit 0
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.