使用文本批随机线(Random line of text using batch)

2019-08-02 14:54发布

一个人怎么能由一个文本文件中选择文本随机线,并设置一个变量使用?

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指令读取最终呼应了线。

上述实施只是为了显示的基本理念。 但也不是没有问题,但他们中的一些可以很容易地解决:

  1. 有没有测试参数是否确实提供。 如果它不存在,该脚本将打破。 你可以在这样的脚本的开头添加必要的检查:

     IF "%~1"=="" GOTO :EOF 

    (如果没有参数,将通过发送控制到脚本的末尾终止脚本GOTO :EOF )。

  2. 指定的文件可能不存在。 同样,你可以测试刚开始时,只是验证参数接通后,如果有必要终止脚本:

     IF NOT EXIST %1 GOTO :EOF 
  3. 如果该文件是空的,则lines将是0和使用它的随后的表达式将零错误碰上一个部门。 因此,你还需要测试得到的线数(和防止脚本运行进一步如果计数确实是0)。 你可以通过添加以下行只是后FOR /F循环:

     IF %lines%==0 GOTO :EOF 
  4. 就像我说的,计算公式是有些简单化。 它不会产生一个大于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!


文章来源: Random line of text using batch