1

Тема: VBScript: Как поменять заголовок консольного окна?

Коллеги, подскажите можно ли как-то поменять заголовок консольного окна в котором выполняется текущий скрипт, по аналогии с тем как это делает команда title в CMD файле?

2

Re: VBScript: Как поменять заголовок консольного окна?

так не пойдет ?

if not WScript.Arguments.Named.Exists("start") then
    CreateObject("WScript.Shell").Run("cmd /c ""title %date% %time% && cscript //nologo """ & WScript.ScriptFullName & """ /start:1""")
    WScript.Quit()
end if
WScript.StdOut.WriteLine now
WScript.Sleep 2000
Я конечно далек от мысли... (с)

3

Re: VBScript: Как поменять заголовок консольного окна?

yuriy2000, напрямую — никак.

4

Re: VBScript: Как поменять заголовок консольного окна?

alexii пишет:

yuriy2000, напрямую — никак.

Жаль...  Я хотел использовать заголовок окна для вывода информации о процентах обработанного материала, как-то не хотелось бы дергать всякий раз CMD /с title  ... для этого.

5

Re: VBScript: Как поменять заголовок консольного окна?

yuriy2000, критичен именно заголовок? Можно использовать в этом качестве «InternetExplorer.Application» или вовсе перевести, если позволяют условия задачи, на использование HTA.

6

Re: VBScript: Как поменять заголовок консольного окна?

yuriy2000 пишет:

не хотелось бы дергать всякий раз CMD ...

Ну так можно обойтись и однократным дёрганьем.

Set WshShell = CreateObject("WScript.Shell")
Set Cmd = WshShell.Exec("cmd")
While True
  Cmd.StdIn.WriteLine "title " & Now
  WScript.Sleep 1000
Wend

7 (изменено: Rom5, 2012-09-18 10:12:58)

Re: VBScript: Как поменять заголовок консольного окна?

wisgest пишет:

..
Ну так можно обойтись и однократным дёрганьем.

Интересный ход. Не смог удержаться ради еще одной вариации, которая выводит не текущее время, а время работы скрипта в секундах:


Set WshShell = CreateObject("WScript.Shell")
Set Cmd = WshShell.Exec("cmd")
dTm1 = Now()
While True
  dTm2 = Now()
  Cmd.StdIn.WriteLine "title " & Int((dTm2 - dTm1)*1000000)/10 & " sec." 
  WScript.Sleep 1000
Wend
WBR. Roman

8

Re: VBScript: Как поменять заголовок консольного окна?

Да, вариант и стдоут совпадают

Я конечно далек от мысли... (с)

9

Re: VBScript: Как поменять заголовок консольного окна?

Интересные решения. Однако здесь отсутствует полезный код.

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

10

Re: VBScript: Как поменять заголовок консольного окна?

  Cmd.StdIn.WriteLine "mode con: cols=16 lines=1"
Rumata пишет:

Однако здесь отсутствует полезный код.

Rumata, почему? Вполне годится.

11

Re: VBScript: Как поменять заголовок консольного окна?

mode con: cols=16 lines=1

Значение cols видимо надо подбирать экспериментально. У меня в консоли на первом месте выводится имя пользователя.

alexii

Rumata пишет:

отсутствует полезный код

Я имел ввиду, что "крутилка" текста в заголовке консоли плохо встраивается в консольное приложение простым совмещением добавлением. Не?

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

12

Re: VBScript: Как поменять заголовок консольного окна?

Rumata пишет:

У меня в консоли на первом месте выводится имя пользователя.

Тогда ещё «prompt»:

Option Explicit

Dim dtStart, dtNow

With WScript.CreateObject("WScript.Shell")
    With .Exec("cmd.exe")
        .StdIn.WriteLine "propmt $S$H"
        .StdIn.WriteLine "mode con: cols=12 lines=1"
        
        dtStart = Now()
        
        Do
            dtNow = Now()
            .StdIn.WriteLine "title " & Int((dtNow - dtStart) * 1000000) / 10 & " sec."
            
            WScript.Sleep 1000
        Loop
    End With
End With

WScript.Quit 0
Rumata пишет:

Я имел ввиду, что "крутилка" текста в заголовке консоли плохо встраивается в консольное приложение простым совмещением добавлением. Не?

Ну, да. Не слишком быстро и не слишком точно. И не всегда годится. Но я так понял — основная мысль была только насчёт индикатора.

13

Re: VBScript: Как поменять заголовок консольного окна?

Rumata пишет:

Интересные решения. Однако здесь отсутствует полезный код.

alexii пишет:

Rumata, почему? Вполне годится.

В общем-то, Rumata прав, в противном случае можно считать "полезным" и такой код:

var code = [
'@echo off',
':begin',
'1>nul ping -n 2 127.0.0.1 & goto:timer',
':timer',
'title %time:~0,8% & goto:begin'
].join('\n');

with (new ActiveXObject('Scripting.FileSystemObject')) {
  var bat = CreateTextFile('temp.bat', true);
  bat.WriteLine(code);
  bat.Close();
}

with (new ActiveXObject('WScript.Shell')) {
  Run('temp.bat');
}

Но на самом деле это обычная "лулза" забавы ради.

14 (изменено: yuriy2000, 2012-09-18 20:35:50)

Re: VBScript: Как поменять заголовок консольного окна?

Всем спасибо за примеры! 

Решил воспользоваться советом alexii

alexii пишет:

Можно использовать в этом качестве «InternetExplorer.Application» или вовсе перевести, если позволяют условия задачи, на использование HTA.

Только в качестве Host-приложения выбрал Excel, т.к. в дальнейшем все равно необходимо выводить значения в Workbook.
А там можно использовать статусную строку...

15

Re: VBScript: Как поменять заголовок консольного окна?

почему этот скрипт работает только 100-114 сек?

Option Explicit

Dim dtStart, dtNow

With WScript.CreateObject("WScript.Shell")
    With .Exec("cmd.exe")
        .StdIn.WriteLine "propmt $S$H"
        .StdIn.WriteLine "mode con: cols=12 lines=1"
        
        dtStart = Now()
        
        Do
            dtNow = Now()
            .StdIn.WriteLine "title " & Int((dtNow - dtStart) * 1000000) / 10 & " sec."
            
            WScript.Sleep 1000
        Loop
    End With
End With

WScript.Quit 0

16 (изменено: wisgest, 2013-01-02 16:00:16)

Re: VBScript: Как поменять заголовок консольного окна?

griha09 пишет:

почему этот скрипт работает только 100-114 сек?

Причина в переполнении буферов потоков  .StdOut или .StdErr объекта WshScriptExec. В данном случае однозначно переполниятся  .StdErr, т.к попытка выполнить

propmt $S$H

вызывает закономерное сообщение об ошибке, ибо нет команды PROPMT, а есть PROMPT.

Также забивается и .StdOut по крайней мере приглашениями командной строки и эхом подаваемых на вход комманд, чтобы этого не происходило лучше вызвать CMD.EXE так:

cmd.exe /q /k echo off

.


Кроме того

mode con: cols=12 lines=1

тоже пишет в .StdOut:

Невозможно отобразить на экране указанное число строк и столбцов.

так что его вывод надо перенаправить в NUL (или считывать).


Чего я не пойму, так это, что полезного делает этот скрипт и зачем в нём нужны PROMPT и MODE (то есть понятно, что MODE можно использовать для очистки окна, т.к. CLS при перенаправлении вывода CMD.EXE, даже в CON, лишь пишет в выходной поток один символ с кодом 0x0C, но очищать-то нечего).

17 (изменено: wisgest, 2013-01-02 15:49:38)

Re: VBScript: Как поменять заголовок консольного окна?

Извиняюсь за невнимательность: мне показалось, что PROMPT и MODE в цикле. Значит, дело не в них, но общая причина та же самая и дело в

wisgest пишет:

забивается и .StdOut по крайней мере приглашениями командной строки и эхом подаваемых на вход комманд…