我正在实现一个批处理程序,该程序分不同步骤执行不同的操作。对于每个步骤,我想显示一个“友好”的文本标题,如下所示:
*************************************************************
* MY FIRST STEP *
*************************************************************
“我的第一步”是一个可以有不同长度的变量。
我的问题:您是否有一个算法或函数可以将此字符串作为输出返回,并将字符串头显示在输入参数中?
提前致谢。
问候
答案1
所有符号的宽度很大程度上取决于所用的字体。没有简单的方法来测量字符串的像素宽度,但有时你不需要它。
Windows 命令行默认使用 Lucida Console,这是一种等宽字体,可简化操作。例如:
@echo off
setLocal EnableDelayedExpansion
set "STR=Boom^!"
set "SIZE=50"
set "LEN=0"
:strLen_Loop
if not "!!STR:~%LEN%!!"=="" set /A "LEN+=1" & goto :strLen_Loop
set "stars=****************************************************************************************************"
set "spaces= "
call echo %%stars:~0,%SIZE%%%
set /a "pref_len=%SIZE%-%LEN%-2"
set /a "pref_len/=2"
set /a "suf_len=%SIZE%-%LEN%-2-%pref_len%"
call echo *%%spaces:~0,%pref_len%%%%%STR%%%%spaces:~0,%suf_len%%%*
call echo %%stars:~0,%SIZE%%%
endLocal
这里的 SIZE 是您要输出的块的长度,请确保它足够大以容纳其中所有可能的行。
我要提醒一下,这将输出一个漂亮的块仅适用于等宽字体。
编辑:修复了 LEN 初始化。
答案2
以下是显示用星号括起来的参数的批处理字符串:
@echo off
setlocal enabledelayedexpansion
rem Set the message to issue as second line
set "msg=* %* *"
rem Calculate the length of the string
set Length=0
for /l %%A in (1,1,1000) do if "%msg%"=="!msg:~0,%%A!" (
set /a Length=%%A
goto :doit
)
:doit
rem Create a string of asterisks of same length
set header=
for /l %%i in (1,1,%Length%) do set "header=!header!*
rem Issue the message
echo %header%
echo %msg%
echo %header%
运行时如下所示: