Тема: VBScript: Как поменять заголовок консольного окна?
Коллеги, подскажите можно ли как-то поменять заголовок консольного окна в котором выполняется текущий скрипт, по аналогии с тем как это делает команда title в CMD файле?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Серый форум → Общение → Windows Script Host, HTA (VBScript, JScript) → VBScript: Как поменять заголовок консольного окна?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Коллеги, подскажите можно ли как-то поменять заголовок консольного окна в котором выполняется текущий скрипт, по аналогии с тем как это делает команда title в CMD файле?
так не пойдет ?
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 2000yuriy2000, напрямую — никак.
yuriy2000, напрямую — никак.
Жаль... Я хотел использовать заголовок окна для вывода информации о процентах обработанного материала, как-то не хотелось бы дергать всякий раз CMD /с title ... для этого. ![]()
yuriy2000, критичен именно заголовок? Можно использовать в этом качестве «InternetExplorer.Application» или вовсе перевести, если позволяют условия задачи, на использование HTA.
не хотелось бы дергать всякий раз CMD ...
Ну так можно обойтись и однократным дёрганьем.
Set WshShell = CreateObject("WScript.Shell")
Set Cmd = WshShell.Exec("cmd")
While True
Cmd.StdIn.WriteLine "title " & Now
WScript.Sleep 1000
Wend..
Ну так можно обойтись и однократным дёрганьем.
Интересный ход. Не смог удержаться ради еще одной вариации, которая выводит не текущее время, а время работы скрипта в секундах:
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Да, вариант и стдоут совпадают
Интересные решения. Однако здесь отсутствует полезный код.
Cmd.StdIn.WriteLine "mode con: cols=16 lines=1"Однако здесь отсутствует полезный код.
Rumata, почему? Вполне годится.
mode con: cols=16 lines=1Значение cols видимо надо подбирать экспериментально. У меня в консоли на первом месте выводится имя пользователя.
alexii
отсутствует полезный код
Я имел ввиду, что "крутилка" текста в заголовке консоли плохо встраивается в консольное приложение простым совмещением добавлением. Не?
У меня в консоли на первом месте выводится имя пользователя.
Тогда ещё «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, почему? Вполне годится.
В общем-то, 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');
}Но на самом деле это обычная "лулза" забавы ради.
Всем спасибо за примеры! ![]()
Решил воспользоваться советом alexii
Можно использовать в этом качестве «InternetExplorer.Application» или вовсе перевести, если позволяют условия задачи, на использование HTA.
Только в качестве Host-приложения выбрал Excel, т.к. в дальнейшем все равно необходимо выводить значения в Workbook.
А там можно использовать статусную строку...
почему этот скрипт работает только 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почему этот скрипт работает только 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, но очищать-то нечего).
Извиняюсь за невнимательность: мне показалось, что PROMPT и MODE в цикле. Значит, дело не в них, но общая причина та же самая и дело в
забивается и .StdOut по крайней мере приглашениями командной строки и эхом подаваемых на вход комманд…
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться