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
我在这里错过了什么明显的事情?
答案 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 (即未定义)