如何在批量输出中将文本居中?

如何在批量输出中将文本居中?

我正在实现一个批处理程序,该程序分不同步骤执行不同的操作。对于每个步骤,我想显示一个“友好”的文本标题,如下所示:

*************************************************************
*                      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%

运行时如下所示:

图像

相关内容