1

Тема: VBS: Очистка экрана

Произвожу запуск скрипта VBS через CScript.exe через командную строку в зацикленном режиме. В батниках или в си используется CLS, а как очистить экран в VBS?


Close = 0
Do

'Cls - здесь должна быть очистка
'зациклено

Loop While Close = 0

2

Re: VBS: Очистка экрана

Напрямую никак.

3

Re: VBS: Очистка экрана

С помощью утилиты MODE:

Set WshShell = CreateObject("WScript.Shell")

Sub Cls()
    WshShell.Exec("mode.com con: lines=0").StdOut.ReadAll
End Sub

4

Re: VBS: Очистка экрана

wisgest, работает. А мне так и не удалось ничего подобрать.

5

Re: VBS: Очистка экрана

Интересное решение. У меня затирает экран и выводит сообщение

The screen cannot be set to the number of lines and columns specified.

. Если читать StdErr вместо StdOut будет тот же эффект и сообщение об ошибке проглатывается.

( 2 * b ) || ! ( 2 * b )

6

Re: VBS: Очистка экрана

Значит, так и сделаем: VBScript: очистка экрана консоли (аналог CLS/Clear Screen) — Windows Script Host, HTA (VBScript, JScript) — Серый форум.

Замечания, предложения, дополнения?

7 (изменено: wisgest, 2018-01-10 04:14:16)

Re: VBS: Очистка экрана

Rumata пишет:

У меня затирает экран и выводит сообщение

The screen cannot be set to the number of lines and columns specified.

При запуске с помощью WshShell.Exec()? Странно, в этом случае и StdOut, и StdErr по-любому перенаправляются скрипту.

Rumata пишет:

Если читать StdErr вместо StdOut будет тот же эффект и сообщение об ошибке проглатывается.

Вообще, у меня сообщение об ошибке идёт именно в StdOut, но читается StdOut не столько для того, чтобы «проглотить» сообщение об ошибке (его всё-равно не видно при таком запуске), сколько для синхронизации.

8 (изменено: wisgest, 2014-03-11 11:54:07)

Re: VBS: Очистка экрана

alexii пишет:

Замечания, предложения, дополнения?

Код черезчур избыточный,

                    .StdOut.ReadAll
                    .StdErr.ReadAll

по-любому обеспечит необходимую синхронизацию без .Status и WScript.Sleep().

9

Re: VBS: Очистка экрана

по-любому обеспечит необходимую синхронизацию без .Status и WScript.Sleep().

Мой опыт показывает, что, увы, нет. Возможно, для данного конкретного случая и будет достаточно, не спорю.

10 (изменено: wildwolf007, 2014-03-12 13:31:44)

Re: VBS: Очистка экрана

Спасибо решение wisgest помогло.

Пока косвенных проблем не почувствовал. Посмотрим дальше.

11 (изменено: Rumata, 2014-03-14 23:34:03)

Re: VBS: Очистка экрана

Замечания, предложения, дополнения?

Скорее дополнение. Но код становится еще более избыточным.

Добавить полный путь до команды mode.com. Возможны два варианта:

абсолютный путь до утилиты
%windir%\\System32\\mode.com

путь относительно сервера сценариев (где WScript.Path может указывать как на %windir%\System32, так и на %windir%\SysWOW64)
WScript.Path + "mode.com"

Который из них лучше?

( 2 * b ) || ! ( 2 * b )

12 (изменено: wisgest, 2014-03-18 15:38:57)

Re: VBS: Очистка экрана

Rumata пишет:

WScript.Path может указывать как на %windir%\System32, так и на %windir%\SysWOW64

Не обязательно. Описание свойства WScript.FullName из книги «Командные файлы и сценарии Windows Script Host»:

Андрей Попов пишет:

Содержит полный путь к исполняемому серверу сценариев (обычно это C:\WINDOWS\COMMAND\CSCRIPT.EXE для консольной версии WSH или C:\WINDOWS\WSCRIPT.EXE для оконной версии)

Rumata пишет:

Добавить полный путь до команды mode.com.

На мой взгляд, излишне по схожей причине.

13

Re: VBS: Очистка экрана

WSH 5.8


// z.js
WScript.Echo('Path     : ' + WScript.Path);
WScript.Echo('PathName : ' + WScript.PathName);
+ результаты

C:\PROGS\TOOLS\JavaScript>c:\Windows\System32\cscript.exe //nologo z.js
Path     : c:\Windows\System32
PathName : undefined

C:\PROGS\TOOLS\JavaScript>c:\Windows\SysWOW64\cscript.exe //nologo z.js
Path     : c:\Windows\SysWOW64
PathName : undefined
( 2 * b ) || ! ( 2 * b )

14

Re: VBS: Очистка экрана

Прошу прощения, имелось в виду, конечно же, свойство .FullName (исправил).
Просто я вначале хотел привести описание из той же таблицы для свойства .Path:

Содержит путь к каталогу, в котором находятся cscript.exe или wscript.exe (обычно это C:\WINDOWS\COMMAND и C:\WINDOWS соответственно)

и в итоге сбился. А передумал потому, что в этом случае названия файлов сервера сценариев указаны безусловно, а в том присутствует оговорка в виде слова «обычно».

+ Вот, кстати, и задача:

Определить, с помощью консольного или оконного сервера исполняется сценарий, не делая никаких предположений из имени исполняемого файла (допустим, он мог быть переименован).

15

Re: VBS: Очистка экрана

Прочитать значение Subsystem из Optional Header?

16

Re: VBS: Очистка экрана

alexii пишет:

Прочитать значение Subsystem из Optional Header?

Насколько я понимаю речь идёт о чтении заголовка EXE-файла. Вполне возможно, не проверял. И насколько это просто сделать скриптом? Скорее всего, в случае wscript.exe/cscript.exe это будет работать однозначно, но всегда ли предопределено, будет приложение исполняться как консольное или нет?

В любом случае речь шла о более скриптовом решении с помощью «утиной типизации» (что на мой взгляд является самым правильным подходом),
а именно, вызовет ли ошибку

CreateObject("Scripting.FileSystemObject").OpenTextFile("CON")

17

Re: VBS: Очистка экрана

а именно, вызовет ли ошибку

В ряде случаев — вызовет.

18

Re: VBS: Очистка экрана

alexii пишет:

В ряде случаев — вызовет.

Если скрипт выполняется не в консоли — это и есть критерий. Нет?

19

Re: VBS: Очистка экрана

Не в консоли. Но задача-то ставилась узнать, какой из хостов используется.

20

Re: VBS: Очистка экрана

alexii пишет:

Но задача-то ставилась узнать, какой из хостов используется.

wisgest пишет:

Определить, с помощью консольного или оконного сервера исполняется сценарий

alexii, а что, возможно несоответствие: скрипт может выполнятся в консоли с помощью неконсольного хоста или наоборот? По-моему, задача одна и та же.

21

Re: VBS: Очистка экрана

Вы ссылку на почту получили от меня? Там пример консольного хоста с перехватом его вывода. В результате возникает ошибка при исполнении указанного кода.

22 (изменено: wisgest, 2014-03-23 14:34:34)

Re: VBS: Очистка экрана

Хорошо, признаю, что предложенный приём позволяет определить именно в консоли или нет выполняется скрипт, а не спомощью какого хоста.
Но с прикладной точки зрения важнее узнать именно первое, поэтому приём не теряет свою значимость.

Для чего надо узнать, с помощью какого хоста (WScript.exe/CScript.exe, возможно, переименованного) выполняется скрипт? Для того лишь, чтобы узнать, как себя будет вести WScript.Echo()? Но, если заведомо требуется диалоговое окно, можно использовать
MsgBox() или WshShell.Popup(),
а если нужен вывод в StdOut, то
WScript.StdOut.WriteLine() или
CreateObject("Scripting.FileSystemObject").GetStandardStream(1).WriteLine()
— да, StdOut доступен и в WScript.exe, если его вывод перенаправляется/перехватывается (невозможно только перенаправление в CON):

wscript.exe script.js > log.txt
wscript.exe script.vbs | more
for /f %i in ('wscript.exe script.wsf') do echo %i
MsgBox WshShell.Exec("wscript.exe script.vbs").StdOut.ReadAll()

А вот от того, в консоли или нет выполняется скрипт, зависит управление из него консольных приложений с помощью WshShell.Exec():
если да, то значит так и было задумано и WshShell.Exec() не будет создавать новых окон;
если же нет, то WshShell.Exec() будет запускать каждое консольное приложение в новом окне (именно так себя ведет себя скрипт в примере alexii, выполняющийся с помощью CScript.exe без собственного консольного окна и с перехватом его вывода VbsEdit)
и, чтобы этого не происходило, можно, чтобы скрипт перезапускал сам себя под управлением консольного хоста в скрытом окне.

И тут встаёт обратная задача — получить путь к консольномо хосту сценариев: стоит ли предполагать, что это CScript.exe, находящийся в одном из каталогов, перечисленных в %Path% или возможно лучшее решение?
Я нашёл только запись в реестре:

C:\>reg query "HKLM\SOFTWARE\Microsoft\Windows Scripting Host\Locations"

! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Scripting Host\Locations
    CScript     REG_EXPAND_SZ   %SystemRoot%\System32\cscript.exe
    WScript     REG_EXPAND_SZ   %SystemRoot%\System32\wscript.exe

— Испольуется ли этот раздел для чего нибудь или это только атавизм, присутствует ли он в 64-разрядных системах?

23 (изменено: alexii, 2014-03-25 05:40:16)

Re: VBS: Очистка экрана

wisgest пишет:

Прочитать значение Subsystem из Optional Header?

Насколько я понимаю речь идёт о чтении заголовка EXE-файла. Вполне возможно, не проверял. И насколько это просто сделать скриптом?

+ открыть спойлер

JScript: краткие сведения о PE файле .

Update: опоздал, Вы уже видели.

24

Re: VBS: Очистка экрана

Да я видел, но уже отметил, что интерес представляет не это:

wisgest пишет:

…признаю, что предложенный приём позволяет определить именно в консоли или нет выполняется скрипт, а не спомощью какого хоста.
Но с прикладной точки зрения важнее узнать именно первое…

+ открыть спойлер
wisgest пишет:

А вот от того, в консоли или нет выполняется скрипт, зависит управление из него консольных приложений с помощью WshShell.Exec():
<…>
если же нет, то WshShell.Exec() будет запускать каждое консольное приложение в новом окне (именно так себя ведет себя скрипт в примере alexii, выполняющийся с помощью CScript.exe без собственного консольного окна и с перехватом его вывода VbsEdit)…