对齐批处理文件的输出For循环

时间:2017-10-14 18:30:04

标签: windows batch-file

REM ************************ HIGH SCORES TABLE
**********************************************
:highscorestable
set /a count = 0
for /f "tokens=1,2,3 delims=-" %%i in (highscores.txt) do (
set hs=%%i
set hsn=%%j
set hsv=%%k
set hst=%%jscored %%iusing%%k

set hsn1=!hsn!
set hsv1=!hsv!
set hs1=!hs!

set hsn1=               %hsn1%
set hsv1=               %hsv1%
set hs1=               %hs1%
echo %hsn1:~-15%               %hsv1:~-15%               %hs1:~-15%

set /a count+=1
if "!count!"=="5" goto :end
)
:end
echo.
pause

我使用For循环从文本文件中拉出前5行。我的变量填充得很好,但是我正在努力处理所需的对齐。

我的最终结果应该是:

James          Commitment            300
Markos         Excellence            290
Jeremy Si      Party                  50

我在这里错过了什么明显的事情?

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

SetLocal EnableDelayedExpansion
REM **************************** HIGH SCORES TABLE ****************************
:highscorestable
Set "count=0"
For /F "UseBackQTokens=1-3Delims=-" %%i In ("highscores.txt") Do (
    Set "hs=%%i"
    Set "hsn=%%j"
    Set "hsv=%%k"
    Set "hst=%%jscored %%iusing%%k"
    Set "hs=   %%i            "
    Set "hsn1=%%j               "
    Set "hsv1=%%k               "
    Echo !hsn1:~,15!!hsv1:~,15!!hs:~-15!
    Set/A count+=1
    If "!count!"=="5" GoTo :end
)
:end
Echo(
Pause

或者没有可能不必要的变量:

SetLocal EnableDelayedExpansion
REM **************************** HIGH SCORES TABLE ****************************
:highscorestable
Set "count=0"
For /F "UseBackQTokens=1-3Delims=-" %%i In ("highscores.txt") Do (
    Set "hs=   %%i            "
    Set "hsn=%%j               "
    Set "hsv=%%k               "
    Set "hst=%%jscored %%iusing%%k"
    Echo !hsn:~,15!!hsv:~,15!!hs:~-15!
    Set/A count+=1
    If "!count!"=="5" GoTo :end
)
:end
Echo(
Pause

在这两种情况下,我都添加了必要的SetLocal EnableDelayedExpansion行,以防万一您的脚本不在您提供的代码之前。

修改

你也可以稍微改变代码,放弃扩展:(我的首选)

REM **************************** HIGH SCORES TABLE ****************************
:highscorestable
For /F "Tokens=1-4Delims=:-" %%A In ('FindStr/N $ "highscores.txt"'
) Do If %%A LEq 5 (Set "hst=%%Cscored %%Busing%%D"
    Set "hss=                                 %%B"
    Set "hsn=%%C                                 "
    Set "hsv=%%D                                 "
    Call Echo %%hsn:~,15%%%%hsv:~,15%%%%hss:~-10%%)
Echo(
Pause

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q46747991.txt"
REM ************************ HIGH SCORES TABLE
REM **********************************************
:highscorestable
set /a count = 0
SET "manyspaces=                                           "
for /f "tokens=1,2,3 delims=-" %%i in (%filename1%) do (
 set hs=%%k&CALL :align hs -8 
 set hsn=%%i&CALL :align hsn 15
 set hsv=%%j&CALL :align hsv 10

 ECHO !hsn!!hsv!!hs!

 set /a count+=1
 if "!count!"=="5" goto end
)
:end
echo.
GOTO :EOF

:align
IF %2 gtr 0 (
 CALL SET "%1=%%%1%%%manyspaces%"
 CALL SET "%1=%%%1:~0,%2%%"
) ELSE (
 CALL SET "%1=%manyspaces%%%%1%%"
 CALL SET "%1=%%%1:~%2%%"
)
GOTO :eof

我编辑了一个我命名为适合我的系统的源文件的结果,因此coulmns的顺序与您未发布的源不同。我改变了元变量赋值。

:align例程通过将第二个参数识别为所需的列宽来剥离土豆,左对齐为正,右对齐为负。

变量manyspaces设置为一个明显的值,其长度足以应对所需的最宽列。显然,既然它一旦建立就不会改变,它在批次的最开始就是最好的设置。

例程使用call set %%var%%方法,无论是否调用delayedexpansion,它都能正常工作。

例如,机制是

 CALL SET "%1=%%%1%%%manyspaces%"

%1 = fred

首先,解析命令。 %1替换为fred%%替换%,产生

  

设置
  " fred的=
  %佛瑞德%[空格]"

因此,将空格字符串附加到指定为%1

的环境变量的当前值

第二个set - 同样分析;结果将分配给指定为%1

的环境变量

因此,例程可用于生成固定宽度的字符串,使用任何普通变量进行适当对齐,即使变量的值为 nothing (即未定义)