[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

需要用批处理程序处理一些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 处于关闭状态。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 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

评分人数

Hope is a sad thing.
https://nsdimo.gitee.io/

TOP

本帖最后由 BingjianREMIX 于 2023-7-9 17:23 编辑

把31行改成
  1. >> "%output%" echo !result:~1!
复制代码
试试
QQ 1980286392

TOP

  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

评分人数

bat小白,请多指教!谢谢!

TOP

回复 2# dimo 是的,输出到原有8个文本了

TOP

回复 3# BingjianREMIX 不行

TOP

回复 4# 77七 可以正确输出了

TOP

返回列表