@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???` を呼び出し、結果をまとめて出力行を形成します。
:padright2 つのパラメータが必要です。1 つ目は内容がパディングされる変数の名前で、2 つ目はパディングされる長さです。
CALL SET padded=%%%1%%%spaces%
解析トリックを使用します。はサブシェルでcall実行しsetます。cmdそのサブシェルで実行される命令は
SET padded=%%.%1.%%.%spaces%
.構文要素を分離するために使用した場所。
%%これはescaped-%そのまま%のエスケープ文字です ( 、 、 などの他の厄介な文字は&、>eg <.によって)エスケープされます。バッチ構文内でその文字を特別な意味を持つのではなく、文字どおりに解釈する場合は、文字が必要です。したがって、 、文字が必要な場合は、(つまり)リダイレクト操作ではなく、必要なリテラルであることをバッチに伝える必要があります。^^&escapeecho>escape>^>
%1例では、ルーチンに指定された最初のパラメーターに置き換えられますname。
実際に実行されるのは
set padded=%name%%spaces%
変数の現在の値の末尾にかなりの数のスペースを文字列化しますname(この投稿は非常に古いため、set "var=value"現在使用している構文の使用よりも前のものであることに注意してください)
その結果、多くのスペースpaddedで埋められた の値が含まれるようになりました。name
CALL SET %1=%%padded:~0,%2%%
2番目の詩-最初と同じ-まあ、ほとんど。実行されるsetコマンドは SET %1.=.%%.paded:~0,.%2.%% です
また
SET name=%padded:~0,18%
に提供される 2 番目のパラメータ:padrightは です18。
paddedこのコマンドは の最初の 18 文字をに割り当てnameます。
:padleft同じように動作しますが、変数の値の前にスペースを追加してから、最後の(2 番目のパラメーター値) 文字を選択します。