将批输出对齐到列中

Dux*_*uxa 5 text cmd batch-file alignment

我有一个批处理文件,它接受可变长度的变量.例如输出是这样的:

%name% - %size% - %percentage% - %percentMIN% - %percentMAX%
%name% - %size% - %percentage% - %percentMIN% - %percentMAX%
%name% - %size% - %percentage% - %percentMIN% - %percentMAX%
%name% - %size% - %percentage% - %percentMIN% - %percentMAX%
%name% - %size% - %percentage% - %percentMIN% - %percentMAX%
Run Code Online (Sandbox Code Playgroud)

因为前两列的长度不同,所以输出会查看所有位置.批处理文件中是否有任何方法使列对齐?我做了一些研究,看起来有一种方法可以通过用空格填充一堆字符来实现它吗?但这似乎不起作用?还有其他办法吗?

Mag*_*goo 5

@ECHO OFF
SETLOCAL
SET "spaces=                               "
SET "somethingelse=Some other data"
SET "name=abc"
SET /a size=123
CALL :formatout
SET "name=abcdefghijkl"
SET /a size=12345678
CALL :formatout
SET "name=a"
SET /a size=3
CALL :formatout

GOTO :EOF

:formatout
CALL :padright name 18
CALL :padleft size 13
ECHO +%name%+%size%+%somethingelse%
GOTO :eof

:padright
CALL SET padded=%%%1%%%spaces%
CALL SET %1=%%padded:~0,%2%%
GOTO :eof

:padleft
CALL SET padded=%spaces%%%%1%%
CALL SET %1=%%padded:~-%2%%
GOTO :eof
Run Code Online (Sandbox Code Playgroud)

这个演示应该让你走上正确的轨道......

输出是

+abc               +          123+Some other data
+abcdefghijkl      +     12345678+Some other data
+a                 +            3+Some other data
Run Code Online (Sandbox Code Playgroud)

它是如何工作的(回应评论)

:formatout
CALL :padright name 18
CALL :padleft size 13
ECHO +%name%+%size%+%somethingelse%
GOTO :eof
Run Code Online (Sandbox Code Playgroud)

让我们从:formatout例程开始。它为每个所需的填充操作调用 :pad???`,然后将结果串在一起以形成输出行。

:padright需要两个参数。第一个是要填充其内容的变量的名称,第二个是要填充的长度。

CALL SET padded=%%%1%%%spaces%
Run Code Online (Sandbox Code Playgroud)

使用解析技巧。该call执行setcmd子shell。在该子shell中执行的指令是

SET padded=%%.%1.%%.%spaces%
Run Code Online (Sandbox Code Playgroud)

我用来.分隔句法元素的地方。

%%这里是一个escaped-%%是它自己的转义字符(其它字符尴尬喜欢&><)等被转义^例如,^&你需要escape,如果你想这个角色被字面解释,而不是批量语法中具有特殊意义的字符。因此, ,如果你想echo一个>字,你需要escape>(即^>)告诉批次,它是字面所需,而不是重定向操作。

%1name在示例中,由提供给例程的第一个参数替换。

所以实际执行的是

set padded=%name%%spaces%
Run Code Online (Sandbox Code Playgroud)

将大量空格串到变量当前值的末尾name(请注意,这篇文章太旧了,它早于set "var=value"我现在使用的语法的使用)

因此,padded现在包含name用多个空格填充的值。

CALL SET %1=%%padded:~0,%2%%
Run Code Online (Sandbox Code Playgroud)

第二节——第一节一样——好吧,差不多。set执行的命令是 SET %1.=.%%.padded:~0,.%2.%%

或者

SET name=%padded:~0,18%
Run Code Online (Sandbox Code Playgroud)

因为提供给的第二个参数:padright18.

并且此命令分配paddedto的前 18 个字符name

:padleft工作方式相同,但在变量值之前添加空格,然后选择最后一个(第二个参数值)字符。