企业如何利用HarmonyOS开发工具提升小程序开发效率与合规性
658
2022-09-16
17个显示彩色字符和动画的批处理代码(四)
上接第三篇
代码16:通过移动光标,用批处理显示动画
::: Cout cursor Macro. Author: T3RRY ::: Filename: Cout.bat::: OS requirement: Windows 10::: Purpose: Facilitate advanced console display output with the easy use of Virtual terminal codes::: Uses a macro function to effect display without users needing to memorise or learn specific::: virtual terminal sequences.::: Enables output of text in 255 bit color at absolute or relative Y;X positions.::: Allows cursor to be hidden or shown during and after text output. See help for more info.@Echo off & Setlocal EnableExtensions============================================== :# Usage If not "%~1" == "" Echo/%~1.|findstr /LIC:"/?" > nul && ( If "%~2" == "" (Cls & Mode 1000,50 & Color 30) If "%~2" == "Usage" ( Color 04 & ( Echo/n|choice /n /C:o 2> nul ) & timeout /T 5 > nul ) If "%~2" == "DE" ( Color 04 & Echo/ --- Delayed expansion detected^^^! Must not be enabled prior to calling %~n0 ---&( Echo/n|choice /n /C:o 2> nul )) If not Exist "%TEMP%\%~n0helpfile.~tmp" (For /F "Delims=" %%G in ('Type "%~f0"^| Findstr.exe /BLIC:":::" 2^> nul ')Do ( For /F "Tokens=2* Delims=[]" %%v in ("%%G")Do Echo(^|%%v^| ))>"%TEMP%\%~n0helpfile.~tmp" Type "%TEMP%\%~n0helpfile.~tmp" | More timeout /T 60 > nul Color 07 If "%~2" == "DE" (Exit)Else Exit /B 1 ) If "!![" == "[" Call "%~f0" "/?" "DE":::[=====================================================================================================================]:::[ cout /? ]:::[ %COUT% Cursor output macro. ]:::[ * Valid Args for COUT: {/Y:Argvalue} {/X:Argvalue} {/S:Argvalue} {/C:Argvalue} ]:::[ - Args Must be encased in curly braces. Arg order does not matter ; Each Arg is optional. ]:::[ * Valid Switches for COUT: /Save /Alt /Main ]:::[ /Save - Stores the Y and X position at the start of the current expansion to .lY and .lX variables ]:::[ /Alt - Switch console to alternate screen Buffer. Persists until /Main switch is used. ]:::[ /Main - Restore console to main screen Buffer. Console default is the main buffer. ]:::[ ]:::[ USAGE: ]:::[ * ArgValue Options ; '#' is an integer: ]:::[ {/Y:up|down|#} {/Y:up#|down#|#} {/Y:#up|#down|#} {/X:left|right|#} {/X:left#|right#|#} {/X:#left|#right|#} ]:::[ * note: {/Y:option} {/X:option} - 1 option only per Arg. ]:::[ - directions: 'up' 'down' 'left' 'right' are relative to the cursors last position. ]:::[ - /Y and /X options - #direction or direction#: ]:::[ Positions the cursor a number of cells from the current position in the given direction. ]:::[ Example; To move the cursor 5 rows up in the same column, without displaying any new text: ]:::[ %COUT%{/Y:5up} ]:::[ - '#' (Absolute position) is the column number {/X:#} or row number {/Y:#} the cursor ]:::[ * Integers for absolute positions contained in variables must be Expanded: {/Y:%varname%} ]:::[ is to be positioned at, allowing cursor position to be set on single or multiple axis. ]:::[ * Absolute Y and X positions capped at line and column maximum of the console display. ]:::[ * Exceeding the maximum Y positions the cursor at the start of the last line in the console display. ]:::[ * Exceeding the maximum X positions the cursor at the start of the next line ]:::[ ]:::[ {/S:Output String} {/S:(-)Output String} {/S:Output String(+)} {/S:Output String(K)} {/S:Output String(.#.)} ]:::[ * note: (-) Hide or (+) Show the Cursor during output of the string. ]:::[ (K) Clears the row of text from the position (K) occurs. ]:::[ Example; Delete 5 characters from the current row to the right of the curser: ]:::[ %COUT%{/S:(.5.)} ]:::[ {/C:VTcode} {/C:VTcode-VTcode} {/C:VTcode-VTcode-VTcode} ]:::[ * note: Chain multiple graphics rendition codes using '-' ]:::[ See: ]:::[ See also: ]:::[=====================================================================================================================]============================================== :# PreScript variable definitionsrem /* generate Vitual Terminal Escape Control .Character */ For /F %%a in ( 'Echo prompt $E ^| cmd' )Do Set "\E=%%a"rem /* */(Set \n=^^^%= Newline variable for macro definitions. DO NOT MODIFY this line or above 2 lines. =%)================== :# Screen Dimensions [Customise columns,lines using the mode command.] Mode 160,38 & Clsrem /* Get screen dimensions [lines] [columns]. Must be done before delayed expansion is enabled. */ For /F "tokens=1,2 Delims=:" %%G in ('Mode')Do For %%b in (%%H)Do For %%a in (%%G)Do Set "%%a=%%b"rem /* NON ENGLISH VERSION USERS: You will need to manually set Columns and lines for their desired console size */ If not defined columns (Set "columns=100"& Set "lines=30")rem /* Cursor position codes - */ Set "left=D"&Set "right=C"&Set "up=A"&set "down=B" For /L %%n in (1 1 %lines%)Do (Set "%%ndown=[%%nB"&Set "down%%n=[%%nB"& set "%%nup=[%%nA"&Set "up%%n=[%%nA") For /L %%n in (1 1 %columns%)Do (Set "%%nleft=[%%nD"&Set "left%%n=[%%nD"&set "%%nright=[%%nC"&set "right%%n=[%%nC")%= Catch Args =%Set COUT=For %%n in (1 2)Do If %%n==2 ( %\n%%= Test No Args =%If "!Args!" == "" (CLS^&Echo/Usage Error. Args Required. ^& Call "%~f0" "/?" "Usage" ^|^| Exit /B 1) %\n%%= Test Braces Used =%If "!Args:}=!" == "!Args!" (CLS^&Echo/Usage Error. Args must be enclosed in curly braces ^& Call "%~f0" "/?" "Usage" ^|^| Exit /B 1) %\n%%= Reset macro =%Set ".Y=" ^& Set ".X=" ^& Set ".Str=" ^& Set ".C=" %\n%%= internal vars =%Set "Arg1=" ^& Set "Arg2=" ^& Set "Arg3=" ^& Set "Arg4=" %\n%%= Split Args. =%For /F "Tokens=1,2,3,4 Delims={}" %%1 in ("!Args!")Do ( %\n%%= Substring =%Set "Arg1=%%~1" %\n%%= modification =%Set "Arg2=%%~2" %\n%%= identifies Args =%Set "Arg3=%%~3" %\n%%= during handling. =%Set "Arg4=%%~4" %\n%%= =%) %\n%%= Check /Save switch =%If not "!Args:/Save=!" == "!Args!" (%\n%%= Reset Cursor Save =%Set ".Cpos=" ^&Set ".Char="%\n%%= 10 char max; Repeat =%For /L %%l in (2 1 12)Do (%\n%%= until R returned =%If not "!.Char!" == "R" (%\n%%= from esc[6n =%^ 代码17:更复杂的批处理代码、更炫酷的动画效果 ::: Author T3RRY : Created 09/04/2021 : Version 1.0.7::: Version changes:::: - ADDED /A switch to allow absolute Y;X value to be supplied as a single switch subarg::: - ADDED /@ switch to allow saving of cursor position. Subarg allows custom return var to store multiple positions.::: - ADDED random subarg for /C color switch.::: - ADDED optional companion switch to /C - '/B'::: - When /C random subarg is used, /B may be used with any ONE of the following: R G B C M Y::: to bias the output color towards Red Green Blue Cyan Magenta or Yellow::: - ADDED support for switches with common prefix.::: - ADDED /T timeout switch for subsecond delays::: - CORRECTED Switch validation method to handle Switches at EOL with no subargs::: - ADDED /E Switch to allow /C value to be preserved or Color to be changed at EOL with an integer subarg.::: - Support REMOVED for switch usage pattern /Switch:value:::::: Purpose : Color and cursor position macro for windows 10 batch files::: - Allows rapid display of colored output at specified screen position.::: For more information, read the usage.:::::: Uses macro parameter and switch handling template.::: - See : offmode 200,60:# Windows Version control. Assigns flag true if system is windows 10. Set "Win10=" Ver | Findstr /LIC:" 10." > nul && Set "Win10=true":# Test if virtual terminal codes enabled ; enable if false:# removes win10 flag definition if version does not support Virtual Terminal sequences If defined Win10 ( Reg Query HKCU\Console | %SystemRoot%\System32\findstr.exe /LIC:"VirtualTerminalLevel REG_DWORD 0x1" > nul || ( Reg Add HKCU\Console /f /v VirtualTerminalLevel /t REG_DWORD /d 1 ) > Nul || Set "Win10=" ) If not defined Win10 ( Echo(Virtual terminal sequences not supported on your system Exit /B 1 ) If "%~1" == "" ( Mode 200,150 Cls ):# /@ Switch requires clean working driectory to execute in. RD "%TEMP%\%~n0_Run" 2> nul && Timeout 1 > nul MD "%TEMP%\%~n0_Run"(Set \n=^^^%= \n macro newline variable. Do not modify =%):# assign virtual terminal control character 0x27 'escape' variable \E For /F %%a in ( 'Echo prompt $E ^| cmd' )Do Set "\E=%%a"::# usage: %$Cout% [/?] | [/Alt | /Main] [/H [-|+]] [/T Int] [/X Int | /L Int | /R Int]::# [/Y Int | /U Int | /D Int] [/K |/Del Int | /I Int] [/N] [/@ {Optional:ReturnVar}]::# [/C Int | /C Int,Int | /C Int;Int | /C random] [/S "String"] [/E {Optional:0|Int}]::# -----------------------------------------------------------------------------------------------------::# Available Switches : Description:::# -----------------------------------------------------------------------------------------------------::# /? : This help screen::#::# /S String : String to be output. Tested for strings of 500 characters.::# /S String{Substituion} : The following characters must be substituted for output:::# /S ^!Variable:/={FS}^! : {AS}:* {DQ}:" {FS}:/ {EQ}:=::#::# /C Integer : Declare output color using VT sequence::# /C Integer,Integer : Chain mulitple VT color sequences::# /C Integer;Integer : Combine multiple VT values into the one sequence::# /C random : Random RGB foreground color::# /B R|G|B|C|M|Y : Bias /C random color toward Red Green Blue::# : Cyan Magenta or Yellow. /C random must be used.::# /E : Preserves /C Color value until /E 0 is used. /C must be used.::# /E 0 : Restores color to Black BG White FG after string output.::# /E Integer : Change color after string output to supplied value.::#::# /A Integer;Integer : Move cursor to Line;Column [ absolute ]::# /Y Integer : Move cursor to Line Integer [ absolute Y ]::# /X Integer : Move cursor to Column Integer [ absolute X ]::# /U Integer : Move cursor Up by Integer::# /D Integer : Move cursor Down by Integer::# /R Integer : Move cursor Right by Integer::# /L Integer : Move cursor Left by Integer::#::# /H - : Hide the cursor : Note - If Cursor state is changed during a code block::# redirected to a file, it cannot be changed again except within a code block.::# /H + : Show the cursor::# /Alt : Switch to alternate buffer [ main buffer is preserved ]::# /Main : Return to main screen buffer [ alternate buffer is cleared ]::# /K : Clears text to right of current cursor position::# /Del Integer : Deletes Integer columns right of the cursor, shifting existing text left::# /I Integer : Inserts whitespace into Integer columns right of Cursor, shifting text right::# /N : Output a newline after other switches are executed.::# /T Integer : Subsecond Delay after output. 25000 = ~1 Second [ Depending on clockspeed ]::#::# /@ : Stores cursor position after execution in variables: $Cout{Y} , $Cout{X}::# : and $Cout{pos} ( VT format 'IntY;IntX' )::# /@ String-ReturnVar : Return values to ReturnVar{pos} ReturnVar{Y} ReturnVar{X}::# *!* : This switch MUST NOT be used during codeblocks that redirect output::# : Slow execution time. ~ 17x slower than typical $Cout expansion::# : 12/100th's vs 0.7/100th's of a second [with a clockspeed of 2904]::#::# Notes:::# - $Cout Macro does not support Concatenation of Expansions.::# - No error validation is performed on switch Integer subargs. Invalid Virtual Terminal sequences::# will be disregarded and output as a string.::#::# Virtual Terminal sequence resource:::# ::# Virtual terminal cursor position capture code source:::# ----------------------------------------------------------------------------------------------------- Set $Cout_Switches="A" "Y" "X" "U" "D" "R" "L" "H" "Alt" "Main" "K" "Del" "I" "N" "T" "B" "C" "E" "S" "@" Set $Cout=For %%n in (1 2)Do if %%n==2 (%\n% For %%G in ( %$Cout_Switches% )Do Set "$Cout_Switch[%%~G]="%\n% If not "!$Cout_args:* /=!" == "!$Cout_args!" (%\n: build $Cout.Args[!$Cout_i.Arg!] array if args present =% Set "$Cout_leading.args=!$Cout_args:*/=!"%\n% For /F "Delims=" %%G in ("!$Cout_leading.args!")Do Set "$Cout_leading.args=!$Cout_args:/%%G=!"%\n% Set ^"$Cout_args=!$Cout_args:"=!"%\n% Set "$Cout_i.arg=0"%\n% For %%G in (!$Cout_leading.args!)Do (%\n% Set /A "$Cout_i.arg+=1"%\n% Set "$Cout_arg[!$Cout_i.arg!]=%%~G"%\n% )%\n% ) Else (%\n: remove doublequotes from args before switch processing =% Set ^"$Cout_args=!$Cout_args:"=!"%\n% )%\n% Set "$Cout_LastSwitch="%\n% For /L %%L in (2 1 4)Do If "!$Cout_LastSwitch!" == "" (%\n% If "!$Cout_Args:~-%%L,1!" == " " Set "$Cout_LastSwitch=_"%\n% If "!$Cout_Args:~-%%L,1!" == "/" (%\n: Flag last switch true if no subargs; Works for character switches of up to 3 characters =% For /F "Delims=" %%v in ('Set /A "%%L-1"')Do Set "$Cout_Switch[!$Cout_Args:~-%%v!]=true"%\n% If not "!$Cout_Args:/?=!." == "!$Cout_Args!." Set "$Cout_Switch[help]=true"%\n% Set "$Cout_Args=!$Cout_Args:~0,-%%L!"%\n% Set "$Cout_LastSwitch=_"%\n% )%\n% )%\n% For %%G in ( %$Cout_Switches% )Do If not "!$Cout_args:/%%~G =!" == "!$Cout_args!" (%\n% Set "$Cout_Switch[%%~G]=!$Cout_Args:*/%%~G =!"%\n% If not "!$Cout_Switch[%%~G]:*/=!" == "!$Cout_Switch[%%~G]!" (%\n% Set "$Cout_Trail[%%~G]=!$Cout_Switch[%%~G]:*/=!"%\n% For %%v in ("!$Cout_Trail[%%~G]!")Do (%\n% Set "$Cout_Switch[%%~G]=!$Cout_Switch[%%~G]: /%%~v=!"%\n% Set "$Cout_Switch[%%~G]=!$Cout_Switch[%%~G]:/%%~v=!"%\n% )%\n% Set "$Cout_Trail[%%~G]="%\n% If "!$Cout_Switch[%%~G]:~-1!" == " " Set "$Cout_Switch[%%~G]=!$Cout_Switch[%%~G]:~0,-1!"%\n% If "!$Cout_Switch[%%~G]!" == "" Set "$Cout_Switch[%%~G]=true"%\n% )%\n% )%\n% If /I "!$Cout_Switch[C]!" == "random" (%\n% If not "!$Cout_Switch[B]!" == "" (Set "$Cout_MOD=100")Else Set "$Cout_MOD=200"%\n% Set /A "$Cout_RR=!random! %% !$Cout_MOD! + 50,$Cout_GG=!random! %% !$Cout_MOD! + 50,$Cout_BB=!random! %% !$Cout_MOD! + 50"%\n% If /I "!$Cout_Switch[B]!" == "R" Set "$Cout_RR=250"%\n% If /I "!$Cout_Switch[B]!" == "G" Set "$Cout_GG=250"%\n% If /I "!$Cout_Switch[B]!" == "B" Set "$Cout_BB=250"%\n% If /I "!$Cout_Switch[B]!" == "M" Set /A "$Cout_RR=!Random! %% 50 + 200,Cout_GG=0,$Cout_BB=!Random! %% 50 + 200"%\n% If /I "!$Cout_Switch[B]!" == "Y" Set /A "$Cout_RR=!Random! %% 90 + 100,Cout_GG=!Random! %% 90 + 90,$Cout_BB=0"%\n% If /I "!$Cout_Switch[B]!" == "C" Set /A "$Cout_RR=0,Cout_GG=!Random! %% 120 + 30,$Cout_BB=175"%\n% Set "$Cout_Switch[C]=38;2;!$Cout_RR!;!$Cout_GG!;!$Cout_BB!"%\n% )%\n% If "!$Cout_Switch[help]!" == "true" ((For /F "Tokens=1,2 Delims=#" %%Y in ('findstr /BLIC:"::#" "%~f0"')Do @Echo(%%Z)^| @More)%\n% If not "!$Cout_Switch[C]!" == "" (Set "$Cout_Color=%\E%[!$Cout_Switch[C]:,=m%\E%[!m")Else Set "$Cout_Color="%\n% If not "!$Cout_Switch[Y]!" == "" (Set "$Cout_Ypos=%\E%[!$Cout_Switch[Y]!d")Else Set "$Cout_Ypos="%\n% If not "!$Cout_Switch[X]!" == "" (Set "$Cout_Xpos=%\E%[!$Cout_Switch[X]!G")Else Set "$Cout_Xpos="%\n% For %%d in (U D L R)Do if not "!$Cout_Switch[%%d]!" == "" (Set /A "$Cout_Switch[%%d]=!$Cout_Switch[%%d]!")%\n% If not "!$Cout_Switch[U]!" == "" (Set "$Cout_Yoffset=%\E%[!$Cout_Switch[U]!A")Else Set "$Cout_Yoffset="%\n% If not "!$Cout_Switch[D]!" == "" Set "$Cout_Yoffset=%\E%[!$Cout_Switch[D]!B"%\n% If not "!$Cout_Switch[R]!" == "" (Set "$Cout_Xoffset=%\E%[!$Cout_Switch[R]!C")Else Set "$Cout_Xoffset="%\n% If not "!$Cout_Switch[L]!" == "" Set "$Cout_Xoffset=%\E%[!$Cout_Switch[L]!D"%\n% If "!$Cout_Switch[H]!" == "-" Set "$Cout_Cursor=%\E%[?25l"%\n% If "!$Cout_Switch[H]!" == "+" Set "$Cout_Cursor=%\E%[?25h"%\n% If "!$Cout_Switch[Main]!" == "true" (Set "$Cout_Buffer=%\E%[?1049l")Else Set "$Cout_Buffer="%\n% If "!$Cout_Switch[Alt]!" == "true" Set "$Cout_Buffer=%\E%[?1049h"%\n% If not "!$Cout_Switch[A]!" == "" (Set "$Cout_Absolutepos=%\E%[!$Cout_Switch[A]!H")Else Set "$Cout_Absolutepos="%\n% If not "!$Cout_Switch[K]!" == "" (Set "$Cout_LineClear=%\E%[K")Else Set "$Cout_LineClear="%\n% If not "!$Cout_Switch[Del]!" == "" (Set "$Cout_Delete=%\E%[!$Cout_Switch[Del]!P")Else Set "$Cout_Delete="%\n% If not "!$Cout_Switch[I]!" == "" (Set "$Cout_Insert=%\E%[!$Cout_Switch[I]!@")Else Set "$Cout_Insert="%\n% If not "!$Cout_Switch[S]!" == "" (%\n% Set "$Cout_String=!$Cout_Switch[S]:{FS}=/!"%\n% Set "$Cout_String=!$Cout_String:{EQ}==!"%\n% Set "$Cout_String=!$Cout_String:{AS}=*!"%\n% Set ^"$Cout_String=!$Cout_String:{DQ}="!"%\n% )Else (Set "$Cout_String=")%\n% If "!$Cout_Switch[E]!" == "true" (Set "$Cout_EOLC=!$Cout_Color!")%\n% If not "!$Cout_Switch[E]!" == "" (Set "$Cout_EOLC=%\E%[!$Cout_Switch[E]!m")%\n% If "!$Cout_EOLC!" == "" (Set "$Cout_EOLC=%\E%[0m")%\n% ^< nul set /P "=!$Cout_Buffer!!$Cout_Cursor!!$Cout_Absolutepos!!$Cout_Ypos!!$Cout_YOffset!!$Cout_Xpos!!$Cout_XOffset!!$Cout_Delete!!$Cout_Insert!!$Cout_Color!!$Cout_LineClear!!$Cout_String!!$COUT_EOLC!"%\n% If "!$Cout_Switch[N]!" == "true" Echo(%\n% If not "!$Cout_Switch[T]!" == "" (For /L %%T in (1 1 !$Cout_Switch[T]!)Do (Call )%= Delay resetting Errorlevel to 0 =%)%\n% If "!$Cout_Switch[help]!" == "true" Pause%\n% If not "!$Cout_Switch[@]!" == "" (%\n% PUSHD "%TEMP%\%~n0_Run"%\n% Set "$Cout{pos}=" ^&Set "$Cout[Char]="%\n% For /L %%l in (2 1 8)Do (%\n% If not "!$Cout[Char]!" == "R" (%\n% ^
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~