【问题标题】:Batch random line for a .txt file.txt 文件的批处理随机行
【发布时间】:2015-01-07 22:24:24
【问题描述】:

我正在编写一个批处理文件,我想在主屏幕上显示一个启动画面。我希望批处理文件从文本文件中选择一个随机行并 ECHO 它。文件名将是splashes.txt。 里面会是这样的:

More addicting the lemons   
Apples.  
This is a splash  
Test

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

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

【问题讨论】:

  • 您是否尝试将问题分解为更小的步骤?例如 - 你怎么知道有多少行可供选择?一旦您建立了一组合理的子任务,您应该能够搜索 StackOverflow 或整个网络以找到如何完成每个任务。如果没有,那么您至少可以展示您尝试过的内容以及您遇到的问题。
  • 您自己有没有努力做到这一点?或者至少通过在这里搜索做了一些研究?现在写成 这是我的要求。为我写我的代码。 B 回到 l8r 得到你的 wrk。谢谢。,我们不是代码编写服务。
  • 我做了很多研究。我找到了方法,但它们并没有像我想要的那样工作。不然我为什么会在这里?我不欣赏你的语气。也许我可以向您展示我的批处理文件的源代码,以证明我自己做了多少?
  • 至少显示您尝试解决问题的示例表明您没有尝试将 SO 用作免费的代码编写服务。这并不意味着你在过去一周的工作的完整日志,也不意味着从一些不相关的批次中随机抽取几行——只是一个有代表性的样本,应该可以在你的机器上轻松地进行剪切和粘贴——或者获胜如果你没有尝试过,就不会。

标签: batch-file


【解决方案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) - 更有效。

Pick-random-number :删除+ 1 会产生0..(numlines-1) 的结果,这是skip实际行数。

问题在于skip=0 无效,因此请构造一个其他(对于0)或“skip=...”(否则)的字符串-一切准备就绪包含在for /f 命令选项中。

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

【讨论】:

  • 它不起作用。 FOR 给了我一个'类型 test.txt 不被识别为内部或外部命令'
  • 必须不同意 - 批次以其原始形式工作。使用的引号类型(单引号、双引号或反引号)很重要可以由一些尝试将文本文档作为 WP 文档处理的实用程序(如WORD)“为您的方便”修改。 Notepad 勉强能胜任这项工作 - 首选文本编辑器(我使用 editplus)。请通过剪切和粘贴来避免拼写错误,而不是重新输入。批次可能对明显的微小变化非常敏感。
  • @Magoo - 很好的编辑。在我发布答案大约一小时后,我考虑过让Skip 语句动态扩展。我最初的解决方案是在您定义源文件的位置添加注释,说明第一行不应包含任何内容(因此+1 将确保 skip 永远不会为 0)。除此之外,我在运行最初发布的脚本时没有任何问题。不过,您计算行数的方法要好得多。
【解决方案2】:

如果您知道要设置的行数,假设为 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]!

【讨论】:

  • 好的。谢谢。我不知道“向量”
【解决方案3】:

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

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

randomline.cmd

@ECHO 关闭 本地化 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

【讨论】:

    猜你喜欢
    • 2012-10-31
    • 2017-02-07
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多