@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中执行的指令是set
cmd
SET padded=%%.%1.%%.%spaces%
我用来.
分隔句法元素的地方。
%%
这是一个escaped-%
as%
是它自己的转义字符(其他尴尬的字符,如, ,&
等>
被例如转义。如果您希望该字符按字面解释而不是在批处理语法中具有其特殊含义,则需要一个字符。因此, 如果你想要一个字符,你需要(ie ) 告诉批处理它是需要的文字,而不是重定向操作。<
)
^
^&
escape
echo
>
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%
因为提供给的第二个参数:padright
是18
.
并且此命令将前 18 个字符分配给padded
to name
。
:padleft
工作方式相同,但在变量值之前添加空格,然后选择最后一个(第二个参数值)字符。