根据文本文件的输出设置参数?

Setting parameter based on output of text file?

我正在编写读取文本文件输出的代码,并将设置第 2 行数值的参数(或变量?)。出于测试目的,它应该从 :NEW 读取,但它没有。

这是文本文件的输出:

var1=RANK|SCORE|NAME
var2=1|52456|NLM
var3=2|24610|ABS
var4=3|23385|ABT
var5=4|22158|ABU
var6=5|21821|ABV
var7=6|20272|ABW
var8=7|19476|ABX
var9=8|18864|ABY

这是我目前所知道的,但显然是不对的:

@echo off
setlocal ENABLEDELAYEDEXPANSION
color 0a
set vidx=0
for /F "tokens=*" %%A in (hiscores.txt) do (
    SET /A vidx=!vidx! + 1
    set var!vidx!=%%A
)
set var

pause

set /p %var2=%

if %var2=% LSS 1|52456|NLM GOTO INVALID
if %var2=% EQU 1|52456|NLM GOTO NEW
if %var2=% GTR 1|52456|NLM GOTO SCORE

:INVALID
echo Sorry, you did not win any tickets this time!
PING -n 3 127.0.0.1 > NUL

:SCORE
echo Congratulations on a new high score!
PING -n 3 127.0.0.1 > NUL

:NEW
echo Congratulations on a new high score!
PING -n 3 127.0.0.1 > NUL
pause

注释:不能设置包含=.

的环境变量名称

|为特殊字符,需要特殊处理

@ECHO OFF
SETLOCAL
rem The following settings for the source directory and filenames are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "sourcedir=u:\your files"
SET "filename1=%sourcedir%\q71082577.txt"

FOR /f "usebackq delims=" %%b IN ("%filename1%") DO (SET "%%b")
SET var

SET /p "score=New score [number,name] ? "

SET "newscore="
FOR %%b IN (%score%) DO IF DEFINED newscore (SET "newname=%%b") else (SET "newscore=%%b")

SET "pos="
FOR /f "tokens=1-4delims==|" %%g IN ('set var') DO IF %newscore% gtr %%i IF NOT DEFINED pos SET /a pos=%%h+1

IF NOT DEFINED pos GOTO notontable

SET pos

:: shuffle lower scores down 1 place

IF %pos% lss 10 FOR /L %%p IN (9,-1,%pos%) DO (
 SET /a from=%%p - 1
 CALL CALL SET "var%%p=%%%%var%%from%%%%%%"
)

SET var

:: put new score into table

SET "var%pos%=new|%newscore%|%newname%"

SET var

:: Now correct column1 of data

FOR /L %%b IN (2,1,9) DO SET /a c1=%%b-1&FOR /f "tokens=1-4delims==|" %%g IN ('set var%%b') DO CALL SET "var%%b=%%c1%%|%%i|%%j"

SET var
SET /a pos-=1
ECHO new position ON table : %pos%

GOTO :EOF

:notontable
ECHO NOT ON high-score table
SET var
GOTO :eof

由于文件的每一行都是 var=string 的形式,您可以简单地执行 SET "linecontents" 来设置 var? 值。

您显然在维护 high-score table...

score,initials 格式从提示中获取候选分数和缩写。我故意未验证此格式,并假设输入始终是正确的,因为它很可能出现在您代码的其他地方。

鉴于字符串“input”的格式正确,变量 newscore 设置为 nothing 并且 %%b 用于一个简单的for 将依次分配两个 comma-separated 令牌中的每一个。第一个标记发现 newscore 未定义,因此将第一个标记分配给 newscore。现在定义了第二个标记 - newscore,因此将标记分配给 newname.

接下来,for/f 依次应用于每个 var? 变量。由于 set 命令将以 var3=2|24610|ABS 的形式传递数据,并且 =| 被定义为分隔符,因此 token1..4 是 "var3","2"分别为“24610”和“ABS”,并将这些值分配给 %%g..%%j。如果新闻分数输入大于 %%i(包含记录的分数),则为 pos 分配一个值(table 位置 + 1)。

如果pos没有定义,那么newly-input分数不大于任何已有的分数,所以它的命运是不在table.[=57=上]

下一位是 tricky.We 需要将每个变量 varn-1 复制到 varn 以将值打乱并复制 var%pos% 的值。首先,只有当 pos 小于 10(这意味着“匹配最低 high-score”)时操作才有意义,所以对于 pos 的其他值,我们需要计算移动哪个变量,并将 that 变量的值分配给 var%pos%.

第一步很明显 - 将 from 设置为比 %%p 小 1 的值。然后是复杂的部分。我试图避免 delayedexpansion 因为如果不调用 ab initio.

会引入“过桥”问题

所以 - 解码语句

CALL CALL SET "var%%p=%%%%var%%from%%%%%%"

第一步是内部 call。假设 %%p 为 5(因此 from 包含 4),则 set 命令被解释为

set "var5=%%var%from%%%"

因为%%p5%%被处理成%。内部 call 从调用进程继承其值,其中 from 定义为 4.

然后 set 命令在另一个子 shell 中是 re-interpreted,然后替代 from,给出

set "var5=%var4%"

因此,该值是根据先前的值设置的,这意味着值会按照 set var

显示的那样向下排列

然后将新值分配给 pos 中的适当条目。

最后一步是更正第一个数据列的值。这只需要为 2..9 完成,因为 1 是常数。从这封信中使用和描述的技术来看,方法应该是显而易见的。