首先回答您的第二个问题,有几种方法可以快速获取文件中的行数。
使用FIND.EXE 方法:
for /f %%x in ('type %FileName% ^| find /v /c ""') do set Lines=%%x
使用find.exe 的优点是可以通过任何文本文件找到 zipps,例如 mad,它甚至可以计算空白行。
使用for 方法:
for /f %%x in (%FileName%) do set /a count=count+1
第二种方法的缺点是for 循环会自动跳过空白行。这种方法的优点是文件只需要访问一次。
由于我们要读入文件的每一行并对其进行操作,因此在读入时对每一行进行计数会更有效率。
在我们继续之前,我应该指出// 不是批处理中的注释标记,会导致错误。使用REM、REMark 命令或一对双冒号:: 来表示cmets。
注意setlocal enabledelayedexpansion 和endlocal 行。 SETLOCAL 使所有变量都是临时的,因此仅在脚本执行期间存在,从而无需在脚本末尾清除每个变量。 enableDelayedExpansion 允许使用 ! 表示法,允许像这样访问变量:!Variable!。最后endLocal 指定脚本中的所有临时变量在哪里消失或恢复到它们之前的setlocal 值。如果您删除了endLocal 行,批处理文件结束时将隐含endlocal。
@Echo Off
setlocal enabledelayedexpansion
Set _InputFile=CONFIG.TXT
set count=
:: Sets each line to a vairable from _data1 to _data##
For /F "tokens=1* delims=:" %%A IN (%_InputFile%) DO (
set /a count=!count!+1
Set "_Data!count!=%%A"
)
:: Create a random number between 1 and %count% using the MOD function in 'set /a'
:: Equivalent to: SET /A n = aRandomNumber - ( theSameRandomNumber / %Count% ) + 1
:: See http://en.wikipedia.org/wiki/Mod_function
set /a n=%random% %% %count% +1
:: Echo # of lines, a random # from 1 to %count%, and a random line from the file:
echo.
echo =================================================
echo File is %count% lines deep
echo Random #: %n%
:: Print a random line of data
:: We are taking advantage of Delayed Expansion and ! notation:
Echo Random Line: "!_data%n%!"
echo.
:: Use SET to echo every line of data read in
echo Whole Set of _data[#] data:
set _data
echo.
endlocal
要记住的一件事是CMD.EXE 带来了旧MS-DOS 固有的一些限制。在这种情况下,有两个重要的限制:
1) 可用内存量受到严格限制。
2) 设置环境变量使用CMD.EXE 会话可用的大量内存。
这对您来说意味着您将被限制在创建大约 100 个_data 变量,因此无法将超过该点的数据保存到变量中。
在旧版本的 Windows 中,您可以为批处理文件创建一个 .PIF 文件(在命令行输入 copy nul BatchName.PIF,然后在 Windows 资源管理器中右键单击它并选择属性)并更改将要占用的内存量运行时分配给它。我认为你甚至可以在 XP 下做到这一点,但我知道在 Windows 7 中你不能。虽然可以下载现有的 .PIF 文件并将其连接到您的批处理文件,但我不知道。