Тема: 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
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.