我有一个程序可以读取文件并输出一个随机文件行号,但是当它输出它时,它只是说“Echo is off”是否有可能解决这个问题? 这是我的代码:
@echo off
setlocal enabledelayedexpansion
set Counter=1
for /f "tokens=* delims=" %%x in (Lists.txt) do (
set "Line_!Counter!=%%x"
set /a Counter+=1
)
set /a Counter=%random% * 100 / 32768 + 1
echo %Counter%
echo "%Line_!Counter!%"
::Just displays echo is off
pause
答案 0 :(得分:1)
echo "!Line_%Counter%!"
会奏效。 (不是非常直观,但如果你考虑的话,这是有意义的)
答案 1 :(得分:1)
您的代码中存在两个问题。
斯蒂芬指出了第一个问题。如果您阅读this问题的答案,您将看到解析器在用感叹号引用的变量之前替换用百分号引用的变量。因此,当解析器尝试处理%Line_!Counter!%
时,!Counter!
仍未在行中替换,因此%Line_!Counter!%
是未定义的变量,并且不替换任何内容。反向(!Line_%Counter%!
)有效,因为当解析器到达该行时,第一个替换是百分号变量,最后一个替换为感叹号变量。
第二个是逻辑错误。这条线
set /a Counter=%random% * 100 / 32768 + 1
如果文件多于或少于100行,将无法按预期工作。如果它有更多,则永远不会选择更高编号的行。如果行数较少,则可以选择高编号的非现有行,因为它不存在,您将再次收到echo is off
消息,试图回显该变量。
@echo off
setlocal enabledelayedexpansion
set Counter=0
for /f "tokens=* delims=" %%x in (Lists.txt) do (
set /a Counter+=1
set "Line_!Counter!=%%x"
)
set /a "selected=%random% %% Counter + 1"
echo %selected%
echo "!Line_%selected%!"
pause