2017-10-14 2 views
0
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 

Je tire les 5 premières lignes d'un fichier texte à l'aide d'une boucle For. Mes variables peuplent bien, mais je suis aux prises avec l'alignement requis.Alignement de la sortie du fichier batch Pour la boucle

Mon résultat final ultime devrait être:

James   Commitment   300 
Markos   Excellence   290 
Jeremy Si  Party     50 

Quelle chose évidente ce que je manque ici?

+0

Vous saviez donc que vous deviez utiliser une extension retardée avec un ensemble de variables, mais vous ne pensiez pas en avoir besoin pour les autres variables? – Squashman

Répondre

0

Vous pouvez essayer ceci:

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 

ou sans les variables éventuellement inutiles:

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 

Dans les deux cas, j'ai ajouté la ligne SetLocal EnableDelayedExpansion nécessaire au cas où il n » t dans votre script avant le code fourni.

Modifier

Vous pouvez également modifier le code un peu précé expansion retardée: (mon option préférée)

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 
+0

Compo - C'est génial !!! Merci. Donc, il semble que j'utilisais le "-" plutôt que "," ... et pourtant cela fonctionnait dans l'autre script que j'avais. Très bizarre mais merci. – Pez

+0

@Pez, j'ai édité mes réponses, pour correspondre à la disposition exacte dans votre exemple, j'avais inclus trop d'espaces et n'avais pas aligné la dernière colonne! – Compo

+0

@Pez, j'ai ajouté un exemple supplémentaire sous ** Modifier ** qui ne dépend pas de l'expansion retardée. Dans celui-ci, j'ai changé 'hs' en' hss' car il semble visuellement plus agréable! – Compo

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 

J'ai effectué vos résultats pour un fichier source que je nommé en fonction de mon système, d'où la séquence des coulées est différente de votre source inédite. J'ai changé l'affectation métavariable en conséquence.

La routine :align épluche les pommes de terre en reconnaissant le second argument comme étant la largeur de colonne requise, positif pour l'alignement à gauche et négatif pour l'alignement à droite.

La variable manyspaces est définie sur une valeur évidente, de longueur suffisante pour gérer la colonne la plus large requise. Évidemment, puisqu'il ne changera pas une fois établi, il est préférable de le définir au tout début du lot.

La routine utilise la méthode call set %%var%% afin qu'elle fonctionne même si delayedexpansion est appelée ou non.

Les mécaniciens sont, par exemple

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

avec %1 = fred

Tout d'abord, analyser la commande.%1 est remplacé par fred et %% par %, ce qui donne

mis
"fred =
% fred% [espaces]"

ajoute donc l'espace-chaîne à la valeur actuelle du variable d'environnement spécifiée comme %1

La deuxième set - analyse de manière similaire; résultat est affecté à la variable d'environnement spécifié en tant %1

Ainsi, la routine peut être utilisé pour générer une chaîne de largeur fixe, de manière appropriée alignée en utilisant une variable ordinaire, même si la variable a une valeur de rien (ie. est undefined)