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)
因为前两列的长度不同,所以输出会查看所有位置.批处理文件中是否有任何方法使列对齐?我做了一些研究,看起来有一种方法可以通过用空格填充一堆字符来实现它吗?但这似乎不起作用?还有其他办法吗?
@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执行set的cmd子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)
因为提供给的第二个参数:padright是18.
并且此命令分配paddedto的前 18 个字符name。
:padleft工作方式相同,但在变量值之前添加空格,然后选择最后一个(第二个参数值)字符。