我试图从文件中获取数据并将其存储在变量中,以便以后在我的批处理文件中使用。
代码示例
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(我已经使用设置为字符串的变量进行测试,将文本解释为胜利的百分比。
答案 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'其他。
其他"魔术"值得注意的变量包括random
,time
,date
,cd
和path
。它们具有特殊含义,最好由cmd
控制。
你不能对一个元变量(循环控制变量)进行子串 - 你必须将它放入一个标准的环境变量中,并将 。
。 %var%
始终引用变量的parse-time
值 - 事实上,%var%
被解析器的值替换为逻辑行被执行。 logical line
可能是许多物理行,包括任何code blocks
- 括在括号中的一系列语句。
IOW,logical line
将for
关键字ip作为其范围内最后一个)
的行。
由于您已调用delayedexpansion
,因此!var!
引用run-time
值,即在循环内更改的值。
所以 - 这里有三种不同的方法。最后一个使用有趣的属性,"tokens=*"
单独从字符串中删除前导分隔符(如空格)。
我担心您使用了endlocal
。 endlocal
的缺点是它放弃了自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