首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >批处理.txt文件的随机行

批处理.txt文件的随机行
EN

Stack Overflow用户
提问于 2015-01-08 06:24:25
回答 3查看 2.5K关注 0票数 0

我正在写一个批处理文件,我想在主屏幕上显示一个闪屏。我希望批处理文件从文本文件中随机选取一行并回显它。文件名为splashes.txt。它会是这样的:

代码语言:javascript
运行
复制
More addicting the lemons   
Apples.  
This is a splash  
Test

批处理文件将根据其行选取一个随机引号。就像如果补丁文件选择了第2行,它将回显“Apples”。

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

EN

回答 3

Stack Overflow用户

发布于 2015-01-08 10:48:21

虽然我同意其他人的观点,你应该自己尝试一下,但这是一个相对简单的脚本,应该可以作为一个很好的学习示例:

代码语言:javascript
运行
复制
@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

代码语言:javascript
运行
复制
@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) -更高效。

Pick-random-number :删除+ 1将生成一个结果0..(numlines-1),它是skip的实际行数。

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

语法SET "var=value" (其中value可以为空)用于确保赋值的值中不包括行尾的任何零散空格。set /a可以安全地使用“无引用”。

票数 1
EN

Stack Overflow用户

发布于 2015-01-08 09:53:50

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

代码语言:javascript
运行
复制
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]!
票数 0
EN

Stack Overflow用户

发布于 2016-05-11 22:23:29

Jason Falkner(和Magoo)的答案的一个实际应用是将他们的脚本放入一个驻留在System32 (比如randomline.cmd)中的.cmd文件中。这将把它集成到命令行实用程序中,通过一个简单的调用线很容易地重用它,避免在所有脚本中一遍又一遍地重写这些行。例如:

如果调用Magoo/Falkner脚本randomline.cmd并将其放入System32中,则为

randomline.cmd

@ECHO关闭SETLOCAL SETLOCAL EnableExtensions

REM源文件。REM此文件的第一行应为空,因为它永远不会被选中。REM另外,这个文件的末尾不应该有空行。设置"TextFile=%1“REM确定行数。对于文本%%a IN (‘键入"%textfile%"^|find /c /v ""'),请设置/a numlines=%%a REM随机选择一行。设置/A RandomLine=(%RANDOM % NumLines%) REM防止跳过所有行。如果"%RandomLine%"=="0“(设置"RandomLine=")否则(设置"RandomLine=skip=%randomline%") REM打印随机行。对于/F "usebackq tokens=* %RandomLine% delims=“%%A IN (TYPE %TextFile%) DO (ECH%%A REM.我们完成了。停止脚本。GOTO Finish ) :Finish ENDLOCAL

通过输入,您可以在命令提示符下的任意位置使用它

随机线any_old_text_file.txt

如果您想要在cmd/bat脚本中使用它,请使用

调用随机行any_old_text_file.txt

,如果您想从文件中的随机行为脚本中的变量设置一个值,可以这样做:

调用radomline file_containing_values_on_each_line.txt>%temp%\randomlinevalue.txt set /p any_old_variable=<%temp%\randomlinevalue.txt %temp%\randomlinevalue.txt

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27829742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档