找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 19736|回复: 6

[文本处理] 【已解决】求助随机抽取文本的批处理输出ECHO处于关闭状态

[复制链接]
发表于 2023-7-9 13:14:42 | 显示全部楼层 |阅读模式
需要用批处理程序处理一些txt文本。bat所在目录下有个文本:1.txt、2.txt、3.txt、4.txt、5.txt、6.txt、7.txt、8.txt,每个txt里有很多行文字。bat批处理循环运行100次,每次从1.txt、3.txt、5.txt中的任意2个txt文本中各随机抽取一行文字,从2.txt、4.txt、6.txt、7.txt、8.txt中的任意3个txt文本中各随机抽取一行文字,最后把将所有随机选取到的文字合并成一行输出到output.txt文本中,没循环一次合并的结果都会单独占据一行。因为是循环100次,所以运行结果就是合并100次,那么output.txt里最终得到的是100行合并后的文字。

运行代码后,output.txt里不是合并后的文字,而是100行ECHO 处于关闭状态。求解!

文件夹里的文件如下:
1.txt
2.txt
3.txt
4.txt
5.txt
6.txt
7.txt
8.txt
merge_texts.bat
output.txt

代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. set "files1=1.txt;3.txt;5.txt"
  4. set "files2=2.txt;4.txt;6.txt;7.txt;8.txt"
  5. set "output=output.txt"

  6. REM 清空输出文件
  7. break > "%output%"

  8. for /l %%i in (1, 1, 100) do (
  9.     set "result="

  10.     REM 随机选取2个txt,每个txt随机选取一行
  11.     for %%j in (%files1%) do (
  12.         set "file=%%j"
  13.         call :ReadRandomLine "!file!" line
  14.         set "result=!result! !line!"
  15.     )
  16.    
  17.     REM 随机选取3个txt,每个txt随机选取一行
  18.     for %%j in (%files2%) do (
  19.         set "file=%%j"
  20.         call :ReadRandomLine "!file!" line
  21.         if !errorlevel! equ 0 (
  22.             set "result=!result! !line!"
  23.         )
  24.     )
  25.    
  26.     REM 输出到文件
  27.     echo !result:~1! >> "%output%"
  28. )

  29. echo "合并完成。"
  30. pause
  31. goto :eof

  32. :ReadRandomLine
  33. setlocal
  34. set "file=%~1"
  35. set "line="
  36. for /f "usebackq skip=%random% tokens=*" %%k in ("%file%") do (
  37.     endlocal & set "line=%%k" & exit /b 0
  38. )
  39. exit /b 1
复制代码
output.txt内容如下:
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-7-9 15:32:57 | 显示全部楼层
本帖最后由 dimo 于 2023-7-9 15:41 编辑

最后一个读取随机行的模块,那个random的数太大了,直接给文件所有行都跳过去了。
生成一个行数多一点的初始文件,就能运行了。

  1. echo off
  2. for /l %%i in (1,1,8) do ((for /l %%n in (0,1,40000) do echo %%i) >> %%i.txt)
复制代码
但是用我这八个txt运行后结果,好像跟要求也不太一样。
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8
1 3 5 2 4 6 7 8

评分

参与人数 1技术 +1 收起 理由
盛世繁华 + 1 乐于助人

查看全部评分

发表于 2023-7-9 17:22:39 | 显示全部楼层
本帖最后由 BingjianREMIX 于 2023-7-9 17:23 编辑

把31行改成
  1. >> "%output%" echo !result:~1!
复制代码
试试
发表于 2023-7-9 18:23:02 | 显示全部楼层
  1. @echo off
  2. set "files1=1.txt;3.txt;5.txt"
  3. set "files2=2.txt;4.txt;6.txt;7.txt;8.txt"
  4. set "output=output.txt"

  5. for /l %%l in (1,1,100) do (
  6.         setlocal enabledelayedexpansion
  7.         call :r1 "%files1%" 2
  8.         for %%d in (!file!) do call :r2 "%%d"
  9.         endlocal
  10.         setlocal enabledelayedexpansion
  11.         call :r1 "%files2%" 3
  12.         for %%d in (!file!) do call :r2 "%%d"
  13.         endlocal
  14.         echo=
  15. )
  16. pause
  17. exit

  18.         :r1
  19.         for %%a in (%~1) do set #!random!!random!=%%a
  20.         for /f "tokens=2 delims==" %%a in ('set #') do (
  21.                 set /a n+=1
  22.                 set file=!file! %%a
  23.                 if !n! equ %~2 exit /b
  24.         )

  25.         :r2
  26.         setlocal enabledelayedexpansion
  27.         for /f "useback delims=" %%b in ("%~1") do set _!random!=%%b
  28.         for /f "tokens=1* delims==" %%b in ('set _') do (
  29.                 set /p=%%c <nul
  30.                 endlocal
  31.                 exit /b
  32.         )
复制代码

评分

参与人数 1技术 +1 收起 理由
盛世繁华 + 1 乐于助人

查看全部评分

 楼主| 发表于 2023-7-9 23:34:35 | 显示全部楼层
回复 2# dimo 是的,输出到原有8个文本了
 楼主| 发表于 2023-7-9 23:37:26 | 显示全部楼层
回复 3# BingjianREMIX 不行
 楼主| 发表于 2023-7-9 23:42:24 | 显示全部楼层
回复 4# 77七 可以正确输出了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 18:20 , Processed in 0.022817 second(s), 11 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表