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???` を呼び出し、結果をまとめて出力行を形成します。

: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 番目のパラメーター値) 文字を選択します。

于 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 に答える