.txt文件的批处理随机行

时间:2015-01-07 22:24:25

标签: batch-file

我正在写一个批处理文件,我想在主屏幕上显示一个启动画面。我希望批处理文件从文本文件和ECHO中选择一个随机行。文件名为splashes.txt。 它就像是:

More addicting the lemons   
Apples.  
This is a splash  
Test

批处理文件会根据其行选择随机引用。 就像补丁文件选择第2行一样,它将是ECHO“苹果”。

请注意,我使用的是Windows 8。 有什么想法吗?

3 个答案:

答案 0 :(得分:1)

虽然我同意其他人的意见,你应该自己尝试这个,但这是一个相对简单的脚本,应该是一个很好的学习实例:

@ECHO OFF
SETLOCAL EnableDelayedExpansion EnableExtensions

REM Source file.
REM The first line on this file should be blank as it will never be selected.
REM Additionally, this file should have no empty lines on the end.
SET TextFile=text.txt

REM Determine the number of lines.
SET NumLines=0
FOR /F "usebackq tokens=* delims=" %%A IN (`TYPE %TextFile%`) DO SET /A NumLines=!NumLines!+1

REM Pick a random line.
SET /A RandomLine=(%RANDOM% %% %NumLines) + 1

REM Prevent skipping all the lines.
IF "%RandomLine%"=="%NumLines%" SET RandomLine=1

REM Print the random line.
FOR /F "usebackq tokens=* skip=%RandomLine% delims=" %%A IN (`TYPE %TextFile%`) DO (
    ECHO %%A
    REM We are done. Stop the script.
    GOTO Finish
)

:Finish
ENDLOCAL

如此接近 - 但并不完全。 SKIP始终至少为1(因为SKIP=0无效)因此永远不会选择文件中的第一行。

这是我从上面得到的文件,有几个问题。由于我的工作方式,我也改变了文件名。我正在使用q27829742.txt包含发布的行。

@ECHO OFF
SETLOCAL
SETLOCAL EnableDelayedExpansion EnableExtensions

REM Source file.
REM The first line on this file should be blank as it will never be selected.
REM Additionally, this file should have no empty lines on the end.
SET "TextFile=q27829742.txt"

REM Determine the number of lines.
FOR /f %%a IN ('type "%textfile%"^|find /c /v ""') DO SET /a numlines=%%a

REM Pick a random line.
SET /A RandomLine=(%RANDOM% %% %NumLines%)

REM Prevent skipping all the lines.
IF "%RandomLine%"=="0" (SET "RandomLine=") ELSE (SET "RandomLine=skip=%randomline%")

REM Print the random line.
FOR /F "usebackq tokens=* %RandomLine% delims=" %%A IN (`TYPE %TextFile%`) DO (
    ECHO %%A
    REM We are done. Stop the script.
    GOTO Finish
)

:Finish
ENDLOCAL

find /v /c方法计算文件中的行(查找不匹配的文件行(/ v)“”(这意味着所有行)并计算它们(/ c) - 效率更高。< / p>

选择随机数:移除+ 1会产生一个结果0..(numlines-1),这是实际行数skip

问题是skip=0无效,所以构造一个字符串,其中为空(对于0)或“skip = ...”(否则) - 所有这些都准备好包含在for /f命令选项中。

语法SET "var=value"(其中value可以为空)用于确保行末尾的任何杂散空格不包含在指定的值中。 set /a可以安全地使用“无报价”。

答案 1 :(得分:0)

如果你知道行数,那就说25。 您可以使用一个向量来保存每一行,然后使用以下示例计算随机索引并打印出相应的行。

setlocal EnableDelayedExpansion
SET line[0]=Apples.
SET line[1]=This is a splash
SET line[2]=Test
SET line[3]=...
SET line[24]=many lines later...


SET /A index=%RANDOM% % 25
ECHO !line[index]!

答案 2 :(得分:0)

Jason Falkner(和Magoo的)答案的实际应用将是他们的脚本并将其放入一个驻留在System32中的.cmd文件(比如randomline.cmd)。这将它集成到命令行实用程序中,使其可以通过简单的调用线轻松重复使用,避免您在所有脚本中反复重写这些行。例如:

如果您调用Magoo / Falkner脚本randomline.cmd并将其放入System32

<强> randomline.cmd

  

@ECHO OFF       SETLOCAL       SETLOCAL EnableDelayedExpansion EnableExtensions

REM Source file.
REM The first line on this file should be blank as it will never be selected.
REM Additionally, this file should have no empty lines on the end.
SET "TextFile=%1"

REM Determine the number of lines.
FOR /f %%a IN ('type "%textfile%"^|find /c /v ""') DO SET /a numlines=%%a

REM Pick a random line.
SET /A RandomLine=(%RANDOM% %% %NumLines%)

REM Prevent skipping all the lines.
IF "%RandomLine%"=="0" (SET "RandomLine=") ELSE (SET "RandomLine=skip=%randomline%")

REM Print the random line.
FOR /F "usebackq tokens=* %RandomLine% delims=" %%A IN (`TYPE %TextFile%`) DO (
    ECHO %%A
    REM We are done. Stop the script.
    GOTO Finish
)

:Finish
ENDLOCAL

您可以通过输入

在命令提示符中的任意点使用它
randomline any_old_text_file.txt

或者如果您想在cmd / bat脚本中使用

call randomline any_old_text_file.txt

如果您想从文件中的随机行为脚本中的变量设置值,您可以执行以下操作:

call radomline file_containing_values_on_each_line.txt>%temp%\randomlinevalue.txt
set /p any_old_variable=<%temp%\randomlinevalue.txt
del %temp%\randomlinevalue.txt