Показать полную графическую версию : [решено] Графическая оболочка для CMD (индикатор состояния)
Меня удивила именно сама форма записи, выглядит как перенаправление потока от комманды к команде, но не содержит обязательного разделителя "|".
Вобщем увидел такое впервые. С остальным все понятно и так (/? пользоваться умеем) ;)
а уменя всегда была мечта, хотяб как игрушку крутящийся курсор зделать, нельзя ли?
хотя я не знаю даже, ну хотяб sleep и потом выход? или может чтё полезное придумать?
# idebug \|/-\|/-..... »
...пользуясь нарисованным выше... ;)
...пришлось повозиться со спецсимволами - в предпоследней строке значок [^] очень нужен!!!
и еще, символов "забой" в StatusText должно быть не меньше чем симвлов самого текста, так что можно заготовить 79-символьную строку из символов #8 и тогда StatusText можно менять динамически, незабывая выравнивать ее пробелами на 79-символьную границу... а вообще эти приколы не позволяют параллельно осуществлять полноценный вывод инфы на экран (его конечно можно эмулировать через буфер и команду CLS, но сие есть "извращения"), а вот игра с названием окна - вещь сильная!
Заодно вопрос - есть встроенные средства получать управление не вводом целой строки (как set /P) а по одному символу?
@Echo off
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
set StagePos=1
set StageLen=4
set CurStages="-\|/"
set StatusText=QWERTYUIOPing...
:loop
call :CurRotate
rem do Something useful...
Goto loop
Exit
:CurRotate
set Cur=!CurStages:~%StagePos%,1!
if %StagePos%==%StageLen% (set StagePos=1) else (set /a StagePos+=1)
set /p None=%StatusText%^%Cur%<nul
Exit /b
хотяб как игрушку крутящийся курсор зделать, нельзя ли? »
Так пойдет?@Echo Off
Echo Курсор врашается
For /L %%a In (1,1,10) Do (
For %%I In (^| / - \) Do (
Set /p X=%%I<Nul
Call :Wait
)
)
Echo.
Echo Курсор остановлен
Pause>nul
Exit
:Wait
rem Здесь варианты задержки для изменения скорости вращения
For /L %%a In (1,1,10000) Do Set a=1
rem nircmdc wait 100
rem Ping -n 1 localhost>Nul
GoTo :EOF
:Wait rem Здесь варианты задержки для изменения скорости вращения »
можно вызывать типовую процедуру таймера (В начало пакетного файла ОБЯЗАТЕЛЬНО включить код SetLocal EnableExtensions):
:Timer
set ExitCode=0
set CTime=%Time:,=%
set CTime=%CTime::=%
if "%Timer%"=="" set /A Timer=%CTime%+%1
if /I %Timer% GEQ 24000000 set /a %CTime%+=24000000
if /I %Timer% LEQ %CTime% (
set ExitCode=1
set /a Timer+=%1
if /I %Timer% GEQ 24000000 set /a %Timer%-=24000000
)
exit /b %ExitCode%
Вызывать так call :Timer XX, где XX - задержка в сотых долях секунды,
а проверять, прошло ли нужное время, через переменную %ErrorLevel% - ноль означает, что время еще не наступило и можно пока еще что-нить сделать полезное.
т.е. этот таймер без ожидания!
... что-то наколбасил тут, вобщем перед использованием смотрим пример: На экран будет выводится следующее пороговое значение таймера ТОЛЬКО когда таймер срабатывает!
Пример использования:
@Echo off
SetLocal EnableExtensions
:loop
call :Timer 20
if ErrorLevel 1 Echo %Timer%
Goto loop
:Timer
set ExitCode=0
set CTime=%Time:,=%
set CTime=%CTime::=%
if "%Timer%"=="" set /A Timer=%CTime%+%1
if /I %Timer% GEQ 24000000 set /a %CTime%+=24000000
if /I %Timer% LEQ %CTime% (
set ExitCode=1
set /a Timer+=%1
if /I %Timer% GEQ 24000000 set /a %Timer%-=24000000
)
exit /b %ExitCode%
… и можно пока еще что-нить сделать полезное.
Вот с этим-то как раз и проблема. Я около полугода назад, наткнувшись на пост (http://forum.oszone.net/post-970752.html#post970752) коллеги amel27, возрадовался, пошёл от него танцевать («крутилки», наподобие выложенной выше, простые проценты, учёт ширины консоли и т.п.)… Всё было замечательно. Работало изумительно. До тех пор, пока, перед выкладыванием, не понадобилось снабдить код реальным примером, где сия функциональность будет не просто сбоку припёка, а, вот так, что называется, — до зарезу. И я ничего подходящего так и не смог найти. Ибо команды, утилиты и пакетные файлы практически не реализуют частичную функциональность, подобно языкам высокого уровня (если её не вводить искусственно; скажем, копируя не одной командой «copy a:\*.txt b:\*.*», а перебирая ручками в «for …»), наподобие VBScript'ового «For Each objFile In objFSO.GetFolder(…).Files». То есть, для визуального отображения куда как более потребна простая «крутилка» или не вычисленный, а простой «безлимитный» индикатор прогресса (т.е. просто отображающего, что процесс идёт) посредством той же вышеозвученной команды «<NUL SET /P strTemp=.».
Оказалось, что нарисовать индикатор прогресса проще, нежели найти, где он действительно нужен в пакетных файлах.
нарисовать индикатор прогресса проще, нежели найти, где он действительно нужен в пакетных файлах »не с той стороны подходите - не задачи надо под фичи искать, а наоборот... ;)
кста, был еще пример применения: http://forum.oszone.net/thread-137412.html
Я в восторге! Невероятно! :)
Одно замечание или пожелание, хочеться чтобы не просто крутился а двигался по строке >...../
Но тут всякие фантазии могут быть и вариации. Я бы представил это как хм... постепенное заполнение
строки текстом и в конце строки всегда крутящийся курсор!
Признаюсь, я видел это в Gentoo загрузочном диске, и это было очень красиво, так меня и не оставило желание, такое повторить но не под башем.
Там как это обычно бывает выводились команды загрузки всяких устройств плавным разворачиванием строк,
закрывающихся крутилкой, как бы она рисует эти строки. :)
Если не влом подумайте ещё, хоть и безделица но блин таг приятно! Причём это ещё раз доказывает,
что CMD не уступает скриптам под баш.
Ещё офтоп, подскажите, можно ли буффер обмена использовать в коммандах типа @echo или > и >>
Я имею ввиду, то что в виндоус в GUI делаем когда Select All / Copy и потом это вставить через "%1" какнибудь? Или может как-то иначе?
semiono, так пойдет?@Echo Off
Setlocal EnableDelayedExpansion
Rem Длина строки
Set len=45
Rem Строка
Set string="Демонстрация ползущего и вращающегося курсора"
For /L %%a In (1,1,%len%) Do (
For %%I In (^| / - \) Do (
Set /p X=%%I<Nul
Call :Wait
)
Set /p X=!string:~%%a,1!<Nul
)
Echo.
Echo Курсор остановлен
Pause>nul
Exit
:Wait
rem Здесь варианты задержки для изменения скорости вращения
For /L %%a In (1,1,3000) Do Set a=1
rem nircmdc wait 100
rem Ping -n 1 localhost>Nul
GoTo :EOF
http://h.imagehost.org/0853/Snap5.png
нецензурщина :)
Кстати, вопрос, а что делать когда квадраты из форума копируешь? Адекватно ли это вставиться в блокнот? И почему у меня интересно кодировка гонит,
я вообще думал у моей виндоус (WinXP SP2 Eng) проблем нету?
1251 =c_1251.nls 1252 =c_1251.nls - тут ли это?
Адекватно ли это вставиться в блокнот? »
Нет. Блокнот не поддерживает DOS кодировку. Уже писал про это, прочтите предыдущую страницу.
У меня akelpad, просто я наверное не контролирую, вернее не знаю,
надо чтоли дос пустой документ создать и тогда вставить? (а в хтмл это под дос чтоли кодировка тут? )
вообще копируется правильно чтоль, просто не отображается?
offtop: у меня наоборот было, зделал я себе chm с помощью конвертера и круто получилось,
хотя кому это другим давал у всех козяблики там 0_0 а у меня нормально!
---
gora, спасибо за скрипт, это просто праздник! крута!
gora, еще раз можно #29 в файле выложить . даже на работе не вижу всех символов .
semiono, akelpad не использую, не знаю...
batyaPS, прикрепил к посту 29.
Ещё офтоп, подскажите, можно ли буффер обмена использовать в коммандах типа @echo или > и >>
Я имею ввиду, то что в виндоус в GUI делаем когда Select All / Copy и потом это вставить через "%1" какнибудь? Или может как-то иначе? »
Про это скажите ктнить тоже чтонибудь?
gora, batyaPS, прикрепил к посту 29. »
архив битый . перезалей плиз
архив битый »
Архив не битый, это lzma2. Распаковывайте только архиватором 7-Zip и только последней версией (9.04beta).
Copy Command Line Output to Windows Clipboard Directly
http://www.labnol.org/software/tutorials/copy-dos-command-line-output-clipboard-clip-exe/2506/
clip.exe [14 kb]
:)
правда я хотел в другую сторону
semiono, напрямую такое сделать никак не получится, но, скорее всего, кто-нибудь уже озаботился подобным, и наверняка есть что-то готовое — стоит поискать.
Если не найдёте, можете попробовать скомпилировать наподобие такого скрипта AutoIt:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Change2CUI=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Include <ClipBoard.au3>
#Include <String.au3>
AutoItSetOption("MustDeclareVars", 1)
Local $hdropDropHandle
Local $lngIDListLenght
Local $arrRetValues
Local $i
Local $strFileNameBuffer
If _ClipBoard_IsFormatAvailable($CF_HDROP) Then
If _ClipBoard_Open(0) Then
$hdropDropHandle = _ClipBoard_GetData($CF_HDROP)
$arrRetValues = DllCall("shell32.dll", "uint", "DragQueryFileW", "uint", $hdropDropHandle, "uint", -1, "wstr", Chr(0), "uint", 0)
$lngIDListLenght = $arrRetValues[0]
For $i = 1 To $lngIDListLenght
$strFileNameBuffer = _StringRepeat(" ", 1024)
$arrRetValues = DllCall("shell32.dll", "uint", "DragQueryFileW", "uint", $hdropDropHandle, "uint", $i - 1, "wstr", $strFileNameBuffer, "uint", StringLen($strFileNameBuffer))
ConsoleWrite($arrRetValues[3] & @CRLF)
Next
_ClipBoard_Close()
EndIf
Else
Exit(1)
EndIf
Exit(0)
Скрипт просто выводит на консоль имена файлов из буфера обмена, которые могут быть разобраны, например, командой «for». Это лишь примерный шаблон, как можно делать, поскольку и пути могут быть куда как длиннее, и вывод в консоль идёт в ANSI, а не OEM, могут быть и ошибки (да и вообще такие утилиты следует писать на C). Ежели что, думаю, в соседней теме Вам помогут довести скрипт до ума, коль и впрямь понадобится.
Цитата semiono:
Адекватно ли это вставиться в блокнот? »
Нет. Блокнот не поддерживает DOS кодировку. Уже писал про это, прочтите предыдущую страницу. »
В программе "NotePad.exe", что поставляется с виндой, выбираем пункт меню "Format" => "Font" => "Terminal" [ => Script: OEM/DOS (других не встречал) ] и вот Вам блокнот, готовый для писанины батников, где видны и #8 и табличная графика (см. аттач):
NiOl, что ж, возможно Вы и правы, но признать его удобным редактором для бат файлов все же не могу. Подсветки синтаксиса нет, коды спец. символов не видны, сомневаюсь, что их можно будет набрать в Блокноте. Не говоря уже о запуске бат файла из редактора при отладке. Да и шрифт Terminal (всего два размера) меня не впечатлил. :(
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC