<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript: консольный индикатор прогресса и подобные приёмы]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=981</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=981&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript: консольный индикатор прогресса и подобные приёмы».]]></description>
		<lastBuildDate>Sat, 22 Dec 2007 10:22:52 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[VBScript: консольный индикатор прогресса и подобные приёмы]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=7278#p7278</link>
			<description><![CDATA[<p>Автор примера - <strong>alexii</strong>, принимали участие - <strong>wisgest</strong> и <strong>The gray Cardinal</strong>.<br />См. подробные комментарии в коде.<br /></p><div class="codebox"><pre><code>Set objFSO = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set objWshShell = WScript.CreateObject(&quot;WScript.Shell&quot;)


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

Set objTSConsole = objFSO.CreateTextFile(&quot;CON&quot;)


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

intLenght = 4
strRepeatingText = &quot;Process completing...&quot;

WScript.Echo
WScript.Echo &quot;Process start&quot;

objTSConsole.Write strRepeatingText &amp; String(intLenght, &quot; &quot;)

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

WScript.Sleep 1000
objTSConsole.WriteLine

WScript.Echo &quot;Process finished&quot;
WScript.Sleep 3000


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

strRepeatingText = &quot;Processing: &quot;

WScript.Echo
WScript.Echo &quot;Process start&quot;

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

WScript.Sleep 1000
objTSConsole.WriteLine

WScript.Echo &quot;Process finished&quot;
WScript.Sleep 3000


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

objTSConsole.Close

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

WScript.Quit 0</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Sat, 22 Dec 2007 10:22:52 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=7278#p7278</guid>
		</item>
	</channel>
</rss>
