首先回答你的第二个问题,有几种方法可以快速获取文件中的行数。
使用FIND.EXE
方法:
for /f %%x in ('type %FileName% ^| find /v /c ""') do set Lines=%%x
使用的优点find.exe
是可以通过任何文本文件(如 mad)找到 zipps,并且它甚至可以计算空行。
使用for
方法:
for /f %%x in (%FileName%) do set /a count=count+1
第二种方法的缺点是for
循环会自动跳过空行。这种方法的优点是文件只需要访问一次。
由于我们要读入文件的每一行并对其进行操作,因此在读入时对每一行进行计数会更有效率。
在我们继续之前,我应该指出这//
不是批处理中的注释标记,并且会导致错误。使用REM
、 REMark 命令或一对双冒号::
来表示注释。
注意setlocal enabledelayedexpansion
和endlocal
线。SETLOCAL
使所有变量都是临时的,因此仅在脚本执行期间存在,从而无需在脚本末尾清除每个变量。enableDelayedExpansion
启用!
符号的使用,允许像这样访问变量:!Variable!
. 最后endLocal
在脚本中指定 WHERE 所有临时变量都死掉或恢复到它们的预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 文件并将其连接到您的批处理文件,但我不知道。