批处理文件:将随机的文本文件行指定为变量供以后使用

时间:2016-06-13 02:13:58

标签: batch-file text random

我试图写一个非常简单的批处理文件供个人使用......除了一件我难以接受的事情之外,它已经完成了。希望这是一个简单的解决方案(在代码方面,我实际上是文盲)。

基本上我要做的就是让脚本从文本文件中选择一个随机行,用几个不同的文本文件做几次,然后我希望将每个文本文件的输出分配给一个变量,以便我可以轻松地以各种组合使用它们......然后重复这个过程。 这就是我现在所拥有的......

@ECHO OFF
:START
SETLOCAL
SETLOCAL EnableDelayedExpansion EnableExtensions

SET "list1=list1.txt"
FOR /f %%a IN ('type "%list1%"^|find /c /v ""') DO SET /a numlines=%%a
SET /A list1random=(%RANDOM% %% %NumLines%)
IF "%list1random%"=="0" (SET "list1random=") ELSE (SET "list1random=skip=%list1random%")
FOR /F "usebackq tokens=* %list1random% delims=" %%A IN (`TYPE %list1%`) DO (
    >> output.txt ECHO %%A
)
:Finish
ENDLOCAL
GOTO START`

这会获取随机行,并将其吐出到文本文件中。一切顺利,下一步,取随机结果并将其分配给变量......

@ECHO OFF
:START
SETLOCAL
SETLOCAL EnableDelayedExpansion EnableExtensions

SET "list1=list1.txt"
FOR /f %%a IN ('type "%list1%"^|find /c /v ""') DO SET /a numlines=%%a
SET /A list1random=(%RANDOM% %% %NumLines%)
IF "%list1random%"=="0" (SET "list1random=") ELSE (SET "list1random=skip=%list1random%")
FOR /F "usebackq tokens=* %list1random% delims=" %%A IN (`TYPE %list1%`) DO (
    SET output1=%%A
)
>> output.txt ECHO %output1%
:Finish
ENDLOCAL
GOTO START

现在输出不再是随机的......而是始终是引用文本文件的最后一行。

编辑:该网站提出了另一个类似于我的问题。但是,该人无法让脚本选择有效的行。我每次都得到一个有效的行,也是一个随机的行(当我通过echo检查它时),但是在继续时将非输出行分配给变量。我不明白,因为它似乎是事后的去随机化。 I.E.两个脚本之间的区别与获取随机结果无关,只是在它拥有它后才对该结果做什么,对吧?

我提前感谢任何帮助,这是我知道完成这一切所需的一切之前的最后一步,我很兴奋!

2 个答案:

答案 0 :(得分:0)

对不起,你是对的...无论如何,我想出了一个简单的解决方法,可能不是最快的处理时间,但无论如何。基本上允许脚本的初始部分将随机结果吐出到文本文件中(看起来工作得很好)然后将文本文件作为变量引用。

@ECHO OFF
:START
SET "list1=list1.txt"
FOR /f %%a IN ('type "%list1%"^|find /c /v ""') DO SET /a numlines=%%a
SET /A listchoice=(%RANDOM% %% %NumLines%)
IF "%listchoice%"=="0" (SET "listchoice=") ELSE (SET "listchoice=skip=%listchoice%")
FOR /F "usebackq tokens=* %listchoice% delims=" %%A IN (`TYPE %list1%`) DO (
>> listoutput.txt ECHO %%A
)
Set /p list=<listoutput.txt
>> result.txt ECHO %list%
:Finish
DEL listoutput.txt
GOTO START

答案 1 :(得分:0)

使用内置的Get-Random cmdlet在PowerShell中很容易做到这一点。

 $line = (Get-Content file.txt | where { $_ } | Get-Random)

这使得它也很容易批量生产。

set filename=file.txt
for /f "tokens=*" %%a in ('powershell -ex bypass -c "gc %filename% | ? { $_ } | Get-Random"') do (
  set "var=%%a"
)

where { $_ }子句仅用于过滤掉任何空行。如果您知道文件没有,则可以省略它。