Como centralizar um texto em uma saída em lote?

1

Estou implementando um programa em lotes que executa algumas coisas diferentes em diferentes etapas. Para cada etapa, quero exibir um cabeçalho de texto "amigável" como este:

*************************************************************
*                      MY FIRST STEP                        *
*************************************************************

"MEU PRIMEIRO PASSO" é uma variável que pode ter vários tamanhos.

Minha pergunta: você tem um algoritmo ou uma função que poderia retornar essa string como saída com o cabeçalho da string para exibir no parâmetro de entrada?

Obrigado antecipadamente.

Atenciosamente

    
por NicoFC34 24.09.2018 / 09:54

2 respostas

0

A largura de todos os símbolos depende muito da fonte usada. Não há uma maneira fácil de medir a largura de pixels de uma string, mas às vezes você não precisa dela.

A linha de comando do Windows, por padrão, usa o Lucida Console, uma fonte monoespaçada, que facilita as coisas. Exemplo seria:

@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 aqui é o comprimento do bloco que você deseja imprimir, verifique se ele é grande o suficiente para caber em todas as linhas possíveis dentro dele.

Eu lembrarei que isso produzirá um bloco bonito apenas em fontes monoespaçadas.

EDIT: Corrigida a inicialização do LEN.

    
por 24.09.2018 / 12:28
0

Aqui está uma sequência em lote que exibe seus parâmetros delimitados por asteriscos:

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

Aqui está o que parece quando é executado:

    
por 24.09.2018 / 11:34