5

我有一个带有可变长度变量的批处理文件。例如输出是这样的:

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

因为前 2 列的长度不同,所以输出看起来遍及所有地方。批处理文件中有什么方法可以使列对齐吗?我已经做了一些研究,似乎有一种方法可以通过用空格填充开始的一堆字符来做到这一点?但这似乎不起作用?有没有其他方法?

4

2 回答 2

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

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

输出是

+abc               +          123+Some other data
+abcdefghijkl      +     12345678+Some other data
+a                 +            3+Some other data

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

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

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

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

CALL SET padded=%%%1%%%spaces%

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

SET padded=%%.%1.%%.%spaces%

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

%%这是一个escaped-%as%是它自己的转义字符(其他尴尬的字符,如, ,&>被例如转义。如果您希望该字符按字面解释而不是在批处理语法中具有其特殊含义,则需要一个字符。因此, 如果你想要一个字符,你需要(ie ) 告诉批处理它是需要的文字而不是重定向操作。<)^^&escapeecho>escape>^>

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

所以实际执行的是

set padded=%name%%spaces%

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

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

CALL SET %1=%%padded:~0,%2%%

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

或者

SET name=%padded:~0,18%

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

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

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

于 2013-07-17T05:38:07.327 回答
0
 set test=A test
        set spce=                 .   
        set spce2=%spce:~0,16%
        set ntest=%test:~0,16%%spce2%
        set ntest2=%ntest:~0,16%

ECHO 123456789012345678  >> c:\temp\testfile.txt
echo %ntest2%^|other field>> c:\temp\testfile.txt
于 2019-04-12T01:07:59.197 回答