尝试读取数据并将其存储在批量变量中

时间:2016-03-18 02:13:54

标签: batch-file

我试图从文件中获取数据并将其存储在变量中,以便以后在我的批处理文件中使用。

代码示例

SETLOCAL EnableDelayedExpansion
:: Reading a line in from a file
for /f "tokens=2 delims=:" %%a in (input.txt) do (
SET "TEMP=%%a"
echo %%a
echo %TEMP%
REM I want TEMP to be set to the value of %%a after the first character
SET "TEMP=%%a:~1%"
)
ENDLOCAL

input.txt中的数据:

O: Dracorex Hivelord, VE, SG, OV, AW, NM, Living Dam, BR, EV, VE #2
R: Silus the Corrupt, EV, OS, EB, VE, BR, DH, BV

我在测试时得到的结果,看它是否按我想要的方式工作:

 SET temp=! Silus the Corrupt, EV, OS, EB, VE, BR, DH, BV!
 ENDLOCAL   & SET TEMP=C:\Users\THOMAS~1\AppData\Local\Temp
 echo  Silus the Corrupt, EV, OS, EB, VE, BR, DH, BV
 echo C:\Users\THOMAS~1\AppData\Local\Temp

似乎无法找出我做错了什么。

我试图做的另一部分

for /f "tokens=*" %%a in (input2.txt) do (
SET STR=%%%a:~26, 6%
call :GetWinChance %STR%
)

input2.txt中的数据

Optimized Deck: 9 units: 86.6667: Dracorex Hivelord, Astral Strutter, Stonewall Garrison, Living Dam, Barracus Redeemed, Vile Emergence #2, Oluth's Volition, Nettle Miscreant, Atomic Wardriver
Optimized Deck: 10 units: 100%: Dracorex Hivelord, Astral Strutter, Stonewall Garrison, Living Dam, Barracus Redeemed, Vile Emergence #2, Oluth's Volition, Nettle Miscreant, Atomic Wardriver

以及我得到的结果:

E:\Programs\Tyrant Unleashed Optimizer>(
SET STR=%~26, 6
 call :GetWinChance
)

试着解释我想要的东西

我想要它,所以我可以在第一个代码示例中获得

Dracorex Hivelord, VE, SG, OV, AW, NM, Living Dam, BR, EV, VE #2
Silus the Corrupt, EV, OS, EB, VE, BR, DH, BV

作为for循环中使用的值。

在第二个代码示例中,我想得到它,所以我有获胜机会,它包含在前26个之后的6个字符中,如下所示:

"86.666"
" 100: "

所以我可以使用我的函数:GetWinChance(我已经使用设置为字符串的变量进行测试,将文本解释为胜利的百分比。

3 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
:: Reading a line in from a file
for /f "tokens=2 delims=:" %%a in (q36074967.txt) do (
 SET "VAR=%%a"
 echo "%%a"
 echo parse... "%VAR%" delayed... "!VAR!"
 REM I want VAR to be set to the value of %%a after the first character
 SET "VAR=!VAR:~1!"
 echo VAR becomes "!VAR!"
)
ECHO ==========================
SET "var="
for /f "tokens=1* delims=:" %%a in (q36074967.txt) do (
 SET "VAR=%%b"
 echo "%%b"
 echo parse... "%VAR%" delayed... "!VAR!"
 REM I want VAR to be set to the value of %%b after the first character
 SET "VAR=!VAR:~1!"
 echo VAR becomes "!VAR!"
)
ECHO ==========================
SET "var="
for /f "tokens=1* delims=:" %%a in (q36074967.txt) do (
 for /f "tokens=*" %%c in ("%%b") do (
 SET "VAR=%%c"
  echo metab="%%b"
  echo metac="%%c"
  echo parse... "%VAR%" delayed... "!VAR!"
 )
)

ENDLOCAL

GOTO :EOF

我使用了一个名为q36074967.txt的文件,其中包含我的测试数据。

所以 - 问题:

首先,不要将temp用作变量名(大小写无关紧要),因为Windows'实用程序使用操作系统提供的temp值来引用临时目录。 tmp完全相同的说法 - 有些使用一个,有些使用t'其他。

其他"魔术"值得注意的变量包括randomtimedatecdpath。它们具有特殊含义,最好由cmd控制。

你不能对一个元变量(循环控制变量)进行子串 - 你必须将它放入一个标准的环境变量中,并将

%var%始终引用变量的parse-time值 - 事实上,%var%被解析器的值替换为逻辑行被执行。 logical line可能是许多物理行,包括任何code blocks - 括在括号中的一系列语句。

IOW,logical linefor关键字ip作为其范围内最后一个)的行。

由于您已调用delayedexpansion,因此!var!引用run-time值,即在循环内更改的值。

所以 - 这里有三种不同的方法。最后一个使用有趣的属性,"tokens=*"单独从字符串中删除前导分隔符(如空格)。

我担心您使用了endlocalendlocal的缺点是它放弃了自setlocal以来对环境所做的所有更改 - 所以如果您希望这些更改能够坚持下去,您需要采取适当的措施。

如果批次到达物理文件结尾,则执行隐式endlocal

答案 1 :(得分:0)

REM Remove faulty comment line
REM :: Reading a line in from a file

SETLOCAL EnableDelayedExpansion


for %f "tokens=2 delims=:" %%a in (input.txt) do (
SET temp=%%a

REM Pointless command set something to it's self
REM SET TEMP=%temp%

echo %%a
echo !TEMP!
)

参见内联评论。看看我移动了!的位置。查看移至setlocal的位置。

如需帮助,请参阅for /?rem /?setlocal /?

答案 2 :(得分:0)

除了“将其存储在变量中供以后使用”之外,这将执行您想要的操作。你是什​​么意思?如果“以后使用”在FOR循环中,那么您可以使用%% b。如果“以后使用”在FOR循环之外,那么你的逻辑是有缺陷的,因为你有1个变量和2个行;所以如果在循环外使用,最后一行将是变量中的唯一一行。

for /f "tokens=1* delims=: " %%a in (input.txt) do echo(%%b

如果您想获得预期的结果,请尝试此操作。请注意,此方法在以下位置后保留空格:(不确定您希望采用哪种方式)。

:: Reading a line in from a file
SETLOCAL ENABLEDELAYEDEXPANSION
for /f "tokens=1* delims=: " %%a in (input.txt) do (
   SET "temp=%%b"
   echo(%%b
   echo(!TEMP!
)
ENDLOCAL