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

[文本处理] [已解决]批处理如何随机提取文本中某行并输出

本帖最后由 hmlstfqtl 于 2023-6-4 13:22 编辑

比如 在一个目录里 有下面几个文本文件
FList.txt
实际内容比下面的这段长很多  具体行数不知道
  1. "D:\bg"
  2. "D:\bg\Photos"
  3. "D:\bg\SS"
  4. ...
  5. ...
  6. ...
复制代码
BGList.txt
实际内容比下面的这段长很多  具体行数不知道
  1. "D:\bg\Photos\1 (1).PNG"
  2. "D:\bg\Photos\1 (2).png"
  3. "D:\bg\Photos\1 (3).png"
  4. "D:\bg\Photos\1 (4).png"
  5. ...
  6. ...
  7. ...
复制代码
内容算是从这里开始
要做这样一个批处理  
随机提取 BGList.txt 文本里的其中一行  然后以下面的格式输出一个名为 desktop.ini 的文件到 FList.txt 这个文本里的路径 并把这个文件夹加上 attrib +s 的系统属性
然后再随机提取 BGList.txt 文本里的其中一行 重复上面的输出工作
也就是每输出一个 desktop.ini 文件就要重新提取一次 BGList.txt 里的某行
还有就是  每个 FList.txt 的路径都只输出一次 desktop.ini 不要误会是输出N多次
格式如下
  1. [{be098140-a513-11d0-a3a4-00c04fd706ec}]
  2. iconarea_image=BGList.txt里随机提取出的内容输出到这里
复制代码
因为文件夹 也就是 FList.txt 里的内容会很多 但是提取出来的行数最少要做到每行都能提取出来 别要不能提取第一行或最后一行什么的  尽量做到每行出现的概率是  1/行数 的概率
另外如果可以做到  所有行数不重复的全部提取完一次后 再进行新的一轮的提取 的话 就更好了就
例如   有4行    随机提取过 第3行 然后后面3次就不会再出现第3行 而出现第1 2 4 行
到第5次的时候 所有行数的随机出现概率刷新 即为 所有的概率又重新为  1/行数
说道这里基本已经说明完了  如果是按照上面的意思写出来的批处理 运行后大概会出现下面的样子
  1. 生成的desktop.ini文件为这样
  2. "D:\bg\desktop.ini"
  3. "D:\bg\Photos\desktop.ini"
  4. "D:\bg\SS\desktop.ini"
复制代码
desktop.ini的内容都不同 即举例为
"D:\bg\desktop.ini"
内容为
  1. [{be098140-a513-11d0-a3a4-00c04fd706ec}]
  2. iconarea_image="D:\bg\Photos\1 (3).png"
复制代码
"D:\bg\Photos\desktop.ini"
内容为
  1. [{be098140-a513-11d0-a3a4-00c04fd706ec}]
  2. iconarea_image="D:\bg\Photos\1 (4).png"
复制代码
"D:\bg\SS\desktop.ini"
内容为
  1. [{be098140-a513-11d0-a3a4-00c04fd706ec}]
  2. iconarea_image="D:\bg\Photos\1 (1).png"
复制代码
不知道表达的清不清楚或有什么模糊 暧昧不清的地方
如果有的话 请回帖指出


[ 本帖最后由 hmlstfqtl 于 2010-4-22 23:56 编辑 ]

至此 终于结贴了。。谢谢各位的帮助 特别是寒星

这里发一个成品 谢谢大家 可以测试下     一切操作可逆 不会影响电脑      图片可以自己添加     推荐使用 快速 版本

这里就把成品给大家发出来

下载链接

http://www.uushare.com/user/gkass/file/2909732

下面是附件说明
  1. 运行文件夹里的 !)生成.bat 即可在全盘文件夹里显示图片
  2. 运行过程切勿关闭运行窗口。
  3. 一切操作都是可逆的。
  4. 当不想要显示图片的时候 再运行一次 !)生成.bat 或者 !)删除.bat 即可
  5. 至于 !)快速.bat 是后面添加的  只搜索到1层目录
  6. 速度当然会很快 而且对系统的稳定不会有影响了
复制代码
华丽的分割线。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
===============================================================================================

下面贴上成品的批处理内容
  1. !)快速.bat
  2. @echo off&setlocal enabledelayedexpansion
  3. if exist "勿删.txt" (goto back) else (goto start)
  4. :back
  5. cls
  6. echo 现在开始删除生成的文件,操作期间一定不要关闭本窗口。
  7. echo 如本机文件夹过多的话,操作的时间就会较长,请耐心等待。谢谢!
  8. for /f "delims=" %%a in (勿删.txt) do if exist "%%a"desktop.ini del /f /a /q "%%a"desktop.ini & attrib -s %%a
  9. for /f "delims=" %%i in (勿删.txt) do if exist %%i\desktop.ini del /f /a /q %%i\desktop.ini & attrib -s %%i
  10. del /f /q /a 勿删.txt
  11. goto xing
  12. :start
  13. cls
  14. echo 如本机文件夹过多的话,操作的时间就会较长,请耐心等待。谢谢!
  15. for /f "skip=4" %%a in ('mountvol ^| find ":"') do if not exist %%a\desktop.ini echo %%a>>勿删.txt
  16. for /f "skip=4" %%i in ('mountvol ^| find ":"') do (for /f "delims=" %%j in ('dir /b /ad "%%i" 2^>nul') do if not exist %%i\desktop.ini echo "%%i%%j">>勿删.txt)
  17. for /f "delims=" %%i in ('dir /a /b /s "*.PNG"') do call:han "%%~fi"
  18. for /F "tokens=1,2* delims==:" %%i in ('set han_^|findstr /n .*') do set "BG_%%i=%%k"&set ye_BG=%%i
  19. for /f "delims=" %%i in (勿删.txt) do set "xing_%%~i=="
  20. for /F "tokens=1,2* delims==:_" %%i in ('set xing_^|findstr /n .*') do set a=%%k&set "Fl_%%i=!a:~0,-2!"&set ye_Fl=%%i
  21. for /l %%i in (1,%ye_BG%,%ye_Fl%) do for /l %%j in (1,1,%ye_BG%) do set/a "gu=%%i-1+%%j"&call set "gu=%%Fl_!gu!%%"&if not defined gu (goto :xing) else (attrib +s "!gu!"
  22. >>"!gu!\Desktop.ini" echo.[{BE098140-A513-11D0-A3A4-00C04FD706EC}]
  23. >>"!gu!\Desktop.ini" echo.IconArea_Image=!BG_%%j!
  24. attrib +s +h +r "!gu!\Desktop.ini"
  25. )
  26. :xing
  27. exit
  28. :han
  29. set han=%random%%random%%random%
  30. if "!han_%han%!"=="" (set "han_%han%=%~1") else goto:han
复制代码
  1. !)生成.bat
  2. @echo off&setlocal enabledelayedexpansion
  3. if exist "勿删.txt" (goto back) else (goto start)
  4. :back
  5. cls
  6. echo 现在开始删除生成的文件,操作期间一定不要关闭本窗口。
  7. echo 如本机文件夹过多的话,操作的时间就会较长,请耐心等待。谢谢!
  8. for /f "delims=" %%a in (勿删.txt) do if exist "%%a"desktop.ini del /f /a /q "%%a"desktop.ini & attrib -s %%a
  9. for /f "delims=" %%i in (勿删.txt) do if exist %%i\desktop.ini del /f /a /q %%i\desktop.ini & attrib -s %%i
  10. del /f /q /a 勿删.txt
  11. goto xing
  12. :start
  13. cls
  14. echo 如本机文件夹过多的话,操作的时间就会较长,请耐心等待。谢谢!
  15. for /f "skip=4" %%a in ('mountvol ^| find ":"') do if not exist %%a\desktop.ini echo %%a>>勿删.txt
  16. for /f "skip=4" %%i in ('mountvol ^| find ":"') do (for /f "delims=" %%j in ('dir /s /b /ad "%%i" 2^>nul') do if not exist %%j\desktop.ini echo "%%j">>勿删.txt)
  17. for /f "delims=" %%i in ('dir /a /b /s "*.PNG"') do call:han "%%~fi"
  18. for /F "tokens=1,2* delims==:" %%i in ('set han_^|findstr /n .*') do set "BG_%%i=%%k"&set ye_BG=%%i
  19. for /f "delims=" %%i in (勿删.txt) do set "xing_%%~i=="
  20. for /F "tokens=1,2* delims==:_" %%i in ('set xing_^|findstr /n .*') do set a=%%k&set "Fl_%%i=!a:~0,-2!"&set ye_Fl=%%i
  21. for /l %%i in (1,%ye_BG%,%ye_Fl%) do for /l %%j in (1,1,%ye_BG%) do set/a "gu=%%i-1+%%j"&call set "gu=%%Fl_!gu!%%"&if not defined gu (goto :xing) else (attrib +s "!gu!"
  22. >>"!gu!\Desktop.ini" echo.[{BE098140-A513-11D0-A3A4-00C04FD706EC}]
  23. >>"!gu!\Desktop.ini" echo.IconArea_Image=!BG_%%j!
  24. attrib +s +h +r "!gu!\Desktop.ini"
  25. )
  26. :xing
  27. exit
  28. :han
  29. set han=%random%%random%%random%
  30. if "!han_%han%!"=="" (set "han_%han%=%~1") else goto:han
复制代码
  1. !)删除.bat
  2. @echo off&setlocal enabledelayedexpansion
  3. echo 如本机文件夹过多的话,操作的时间就会较长,请耐心等待。谢谢!
  4. echo 显示的错误也属于正常的,不必担心本操作失误造成系统出现问题。
  5. echo 运行窗口一定不要关闭,切记。
  6. del /f /q /a 勿删.txt >nul 2>nul
  7. for /f "skip=4" %%a in ('mountvol ^| find ":"') do for /f "tokens=*" %%i in ('dir /s /ashr /b "%%a"desktop.ini') do echo %%~dpi>>勿删.txt
  8. for /f "delims=" %%a in (勿删.txt) do if exist "%%a"desktop.ini del /f /a /q "%%a"desktop.ini & attrib -s %%a
  9. for /f "delims=" %%i in (勿删.txt) do if exist %%i\desktop.ini del /f /a /q %%i\desktop.ini & attrib -s %%i
  10. del /f /q /a 勿删.txt
  11. exit
复制代码

[ 本帖最后由 hmlstfqtl 于 2010-4-23 08:44 编辑 ]

TOP

原帖由 hmlstfqtl 于 2010-4-21 12:52 发表

突然发现文件夹太多了!!!寒一个 - -

也没有办法只搜索1层的目录层次

E:\电影\笔记
E:\电影\死亡
E:\电影\不要搜索我

只搜索到 E:\电影         电影文件夹下的子文件就不要了    反正2层的目录基本不怎么打开

1,你的意思是只要根目录下的文件夹名?
在dir的时候不使用/s
2,对所有目录去设置desktop.ini本身就不可取,例如对%tmp%目录设置后,Windows Movie Maker 程序将无法工作等等。
3,我在2楼的代码没有考虑文件夹名中是否有敏感字符的问题\没有考虑目录权限的问题,没有考虑是否为畸形目录的问题...
4,你没贴出你运行的代码。

[ 本帖最后由 hanyeguxing 于 2010-4-21 14:19 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

突然发现文件夹太多了!!!寒一个 - -

也没有办法只搜索1层的目录层次


E:\电影\笔记
E:\电影\死亡
E:\电影\不要搜索我


只搜索到 E:\电影         电影文件夹下的子文件就不要了    反正2层的目录基本不怎么打开

TOP

执行的时候会有一些路径出现错误 怎么把错误显示隐藏起来 >2nul 加到哪里

TOP

原帖由 hmlstfqtl 于 2010-4-20 09:02 发表
寒星的批写的甚好甚强大
全部文件都定义到变量 是很好  而且随即提取和输出也做得很完美
先谢谢寒星了
在此 希望 寒星 再帮写一个  按照本帖说明 的P处理 我想仔细研究研究 谢谢了


把我的代码里的:
  1. for /f "delims=" %%i in ('dir /a-d /b /s "*.png"') do call:han "%%~fi"
复制代码
改成
  1. for /f "delims=" %%i in (BGList.txt) do call:han %%i
复制代码
把我的代码里的:
  1. for /f "skip=4" %%i in ('mountvol^|find ":"') do for /f "delims=" %%j in ('dir /s /b /ad "%%i" 2^>nul') do if not exist "%%j\desktop.ini" set "xing_%%j=="
复制代码
改成
  1. for /f "delims=" %%i in (FList.txt) do set "xing_%%~i=="
复制代码
不就可以了吗????

[ 本帖最后由 hanyeguxing 于 2010-4-20 16:29 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

寒星的批写的甚好甚强大

全部文件都定义到变量 是很好  而且随即提取和输出也做得很完美

先谢谢寒星了


在此 希望 寒星 再帮写一个  按照本帖说明 的P处理 我想仔细研究研究 谢谢了

TOP

桌面广告?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1* delims=:" %%i in ('findstr /N .* BGlist.txt') do (
  4.      set /a num=%%~i
  5.      set /a num=%random%%%!num!+1
  6.      if "!num!" == "%%i" set stt=%%~j
  7.                                                                    )
  8. for /f "delims=" %%a in (Flist.txt) do (
  9.        set str=%%a
  10.        call md !str! 1>nul 2>nul
  11.        >!str!\desktop.ini echo [{be098140-a513-11d0-a3a4-00c04fd706ec}]
  12.        >>!str!\desktop.ini echo iconarea_image="!stt!"
  13.                                        )
  14. echo !stt!
  15. findstr /v "\<!stt!\>" BGlist.txt >>tmp_.txt
  16. del BGlist.txt
  17. ren tmp_.txt BGlist.txt
  18. pause
复制代码
这样应该可以了,但是没有添加循环。
心得:
1.刚开始测试的时候,findstr /v "\<!stt!\>" BGlist.txt >>tmp_.txt是写成这样findstr /v "!stt!" BGlist.txt >>tmp_.txt,导致运行一次,生成的tmp_.txt是0字节文本,BGlist.txt也直接变成0字节文本了。可能是D:\bg\Photos\1 (4).png中间有空格,然后把含有D:\bg\Photos\1的所有行去掉,这样的话整个BGlist.txt就直接没有剩下的行了。
2.
>!str!\desktop.ini echo [{be098140-a513-11d0-a3a4-00c04fd706ec}]这里这样写其实是因为我不会输出两行,别人的那个换行输出帖子我还没整明白,因为他那个代码我这测试时没换行的。你这第一行是固定不变的,我就直接用>来写,保证每次循环的时候dekstop.ini的内容不多不少, 刚好够

[ 本帖最后由 sgaizxt001 于 2010-4-20 04:47 编辑 ]

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /a-d /b /s "*.png"') do call:han "%%~fi"
  3. for /F "tokens=1,2* delims==:" %%i in ('set han_^|findstr /n .*') do set "BG_%%i=%%k"&set ye_BG=%%i
  4. for /f "skip=4" %%i in ('mountvol^|find ":"') do for /f "delims=" %%j in ('dir /s /b /ad "%%i" 2^>nul') do if not exist "%%j\desktop.ini" set "xing_%%j=="
  5. for /F "tokens=1,2* delims==:_" %%i in ('set xing_^|findstr /n .*') do set a=%%k&set "Fl_%%i=!a:~0,-2!"&set ye_Fl=%%i
  6. for /l %%i in (1,%ye_BG%,%ye_Fl%) do for /l %%j in (1,1,%ye_BG%) do set/a "gu=%%i-1+%%j"&call set "gu=%%Fl_!gu!%%"&if not defined gu (goto :xing) else (attrib +s "!gu!"
  7. >>"!gu!\Desktop.ini" echo.[{BE098140-A513-11D0-A3A4-00C04FD706EC}]
  8. >>"!gu!\Desktop.ini" echo.IconArea_Image=!BG_%%j!
  9. attrib -s "!gu!")
  10. :xing
  11. exit
  12. :han
  13. set han=%random%%random%%random%
  14. if "!han_%han%!"=="" (set "han_%han%=%~1") else goto:han
复制代码
1,本批处理不产生临时文件,所需内容全部定义为变量
2,由于大量操作,所以批处理中尽量少使用set/a以加快运行速度

[ 本帖最后由 hanyeguxing 于 2010-4-20 06:36 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

返回列表