一个人怎么能由一个文本文件中选择文本随机线,并设置一个变量使用?
Answer 1:
这里的另一种方法。 它读取命令行输入文件名,并使用FOR /L
循环去计算行数:
@ECHO OFF
FOR /F "" %%I IN ('FIND /C /V "" ^<%1') DO SET /A lines=%%I
SET /A skip=%RANDOM%%%lines
<%1 (
FOR /L %%I IN (1,1,%skip%) DO (
SET /P line=
)
SET line=
SET /P line=
)
ECHO(%line%
该FOR /F
循环只是获取(该方法是从借来的文件中的行数@ Aacini的答案 )。
一个相当简单的公式,然后计算线的数目在文件中跳过。
接下来,该文件被读取。 的FOR /L
循环仅仅消耗使用指定的行数SET /P
指令。 继环,多了一个SET /P
指令读取最终呼应了线。
上述实施只是为了显示的基本理念。 但也不是没有问题,但他们中的一些可以很容易地解决:
有没有测试参数是否确实提供。 如果它不存在,该脚本将打破。 你可以在这样的脚本的开头添加必要的检查:
IF "%~1"=="" GOTO :EOF
(如果没有参数,将通过发送控制到脚本的末尾终止脚本
GOTO :EOF
)。指定的文件可能不存在。 同样,你可以测试刚开始时,只是验证参数接通后,如果有必要终止脚本:
IF NOT EXIST %1 GOTO :EOF
如果该文件是空的,则
lines
将是0
和使用它的随后的表达式将零错误碰上一个部门。 因此,你还需要测试得到的线数(和防止脚本运行进一步如果计数确实是0)。 你可以通过添加以下行只是后FOR /F
循环:IF %lines%==0 GOTO :EOF
就像我说的,计算公式是有些简单化。 它不会产生一个大于32767号,它是的限制
%RANDOM%
这很可能是够你,但如果不是的话,你可以在范围扩大2 30 -1使用两到%RANDOM%
的呼叫是这样的:SET /A skip=(%RANDOM%*32768+%RANDOM%)%%lines
所以,这里的同一个脚本再次,修订,以解决上述问题:
@ECHO OFF
IF "%~1"=="" GOTO :EOF
IF NOT EXIST %1 GOTO :EOF
FOR /F "" %%I IN ('FIND /C /V "" ^<%1') DO SET /A lines=%%I
IF %lines%==0 GOTO :EOF
SET /A skip=(%RANDOM%*32768+%RANDOM%)%%lines
<%1 (
FOR /L %%I IN (1,1,%skip%) DO (
SET /P line=
)
SET line=
SET /P line=
)
ECHO(%line%
另外一个需要注意的是,如果你愿意,你可以添加信息解释脚本提前终止的原因。 基本上,无论你想添加的消息,你只需要更换单
GOTO :EOF
同
(ECHO your message & GOTO :EOF)
例如:
IF NOT EXIST %1 (ECHO Error! File not found & GOTO :EOF)
Answer 2:
下面的批处理程序是埃坦的解决方案略作修改的运行速度:
@echo off
setlocal EnableDelayedExpansion
set INPUT_FILE="test.txt"
:: # Count the number of lines in the text file and generate a random number
for /f "usebackq" %%a in (`find /V /C "" ^< %INPUT_FILE%`) do set lines=%%a
set /a randnum=%RANDOM% * lines / 32768 + 1, skiplines=randnum-1
:: # Extract the line from the file
set skip=
if %skiplines% gtr 0 set skip=skip=%skiplines%
for /f "usebackq %skip% delims=" %%a in (%INPUT_FILE%) do set "randline=%%a" & goto continue
:continue
echo Line #%randnum% is:
echo/!randline!
Answer 3:
喜欢它已经提到这里在StackOverflow上,除其他外, %RANDOM%
扩展到0和32767之间的随机数。
您可以使用此机制来生成一个随机的行号。 然而,使之成为有效的行号,你将不得不在输入文本文件中的行数正常化它。
这里有一个简单的脚本显示了如何做到这一点:
@echo off
setlocal enabledelayedexpansion
set INPUT_FILE="test.txt"
:: # Count the number of lines in the text file and generate a random number
set lines=0
for /f "usebackq" %%a in (%INPUT_FILE%) do set /a lines+=1
echo %RANDOM% >nul
set /a randnum=%RANDOM% * !lines! / 32768 + 1
:: # Extract the line from the file
set lines=0
for /f "usebackq tokens=*" %%a in (%INPUT_FILE%) do (
set /a lines+=1
if !lines!==!randnum! set randline=%%a
)
echo Line #!randnum! is:
echo.!randline!