标题: [文本处理] [已解决]批处理如何随机提取文本中某行并输出 [打印本页]
作者: hmlstfqtl 时间: 2010-4-20 01:21 标题: [已解决]批处理如何随机提取文本中某行并输出
本帖最后由 hmlstfqtl 于 2023-6-4 13:22 编辑
比如 在一个目录里 有下面几个文本文件
FList.txt
实际内容比下面的这段长很多 具体行数不知道- "D:\bg"
- "D:\bg\Photos"
- "D:\bg\SS"
- ...
- ...
- ...
复制代码
BGList.txt
实际内容比下面的这段长很多 具体行数不知道- "D:\bg\Photos\1 (1).PNG"
- "D:\bg\Photos\1 (2).png"
- "D:\bg\Photos\1 (3).png"
- "D:\bg\Photos\1 (4).png"
- ...
- ...
- ...
复制代码
内容算是从这里开始
要做这样一个批处理
随机提取 BGList.txt 文本里的其中一行 然后以下面的格式输出一个名为 desktop.ini 的文件到 FList.txt 这个文本里的路径 并把这个文件夹加上 attrib +s 的系统属性
然后再随机提取 BGList.txt 文本里的其中一行 重复上面的输出工作
也就是每输出一个 desktop.ini 文件就要重新提取一次 BGList.txt 里的某行
还有就是 每个 FList.txt 的路径都只输出一次 desktop.ini 不要误会是输出N多次
格式如下- [{be098140-a513-11d0-a3a4-00c04fd706ec}]
- iconarea_image=BGList.txt里随机提取出的内容输出到这里
复制代码
因为文件夹 也就是 FList.txt 里的内容会很多 但是提取出来的行数最少要做到每行都能提取出来 别要不能提取第一行或最后一行什么的 尽量做到每行出现的概率是 1/行数 的概率
另外如果可以做到 所有行数不重复的全部提取完一次后 再进行新的一轮的提取 的话 就更好了就
例如 有4行 随机提取过 第3行 然后后面3次就不会再出现第3行 而出现第1 2 4 行
到第5次的时候 所有行数的随机出现概率刷新 即为 所有的概率又重新为 1/行数
说道这里基本已经说明完了 如果是按照上面的意思写出来的批处理 运行后大概会出现下面的样子- 生成的desktop.ini文件为这样
- "D:\bg\desktop.ini"
- "D:\bg\Photos\desktop.ini"
- "D:\bg\SS\desktop.ini"
复制代码
desktop.ini的内容都不同 即举例为
"D:\bg\desktop.ini"
内容为- [{be098140-a513-11d0-a3a4-00c04fd706ec}]
- iconarea_image="D:\bg\Photos\1 (3).png"
复制代码
"D:\bg\Photos\desktop.ini"
内容为- [{be098140-a513-11d0-a3a4-00c04fd706ec}]
- iconarea_image="D:\bg\Photos\1 (4).png"
复制代码
"D:\bg\SS\desktop.ini"
内容为- [{be098140-a513-11d0-a3a4-00c04fd706ec}]
- iconarea_image="D:\bg\Photos\1 (1).png"
复制代码
不知道表达的清不清楚或有什么模糊 暧昧不清的地方
如果有的话 请回帖指出
[ 本帖最后由 hmlstfqtl 于 2010-4-22 23:56 编辑 ]
作者: hanyeguxing 时间: 2010-4-20 03:55
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /a-d /b /s "*.png"') do call:han "%%~fi"
- for /F "tokens=1,2* delims==:" %%i in ('set han_^|findstr /n .*') do set "BG_%%i=%%k"&set ye_BG=%%i
- 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=="
- 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
- 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!"
- >>"!gu!\Desktop.ini" echo.[{BE098140-A513-11D0-A3A4-00C04FD706EC}]
- >>"!gu!\Desktop.ini" echo.IconArea_Image=!BG_%%j!
- attrib -s "!gu!")
- :xing
- exit
- :han
- set han=%random%%random%%random%
- if "!han_%han%!"=="" (set "han_%han%=%~1") else goto:han
复制代码
1,本批处理不产生临时文件,所需内容全部定义为变量
2,由于大量操作,所以批处理中尽量少使用set/a以加快运行速度
[ 本帖最后由 hanyeguxing 于 2010-4-20 06:36 编辑 ]
作者: sgaizxt001 时间: 2010-4-20 03:55
桌面广告?- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%i in ('findstr /N .* BGlist.txt') do (
- set /a num=%%~i
- set /a num=%random%%%!num!+1
- if "!num!" == "%%i" set stt=%%~j
- )
- for /f "delims=" %%a in (Flist.txt) do (
- set str=%%a
- call md !str! 1>nul 2>nul
- >!str!\desktop.ini echo [{be098140-a513-11d0-a3a4-00c04fd706ec}]
- >>!str!\desktop.ini echo iconarea_image="!stt!"
- )
- echo !stt!
- findstr /v "\<!stt!\>" BGlist.txt >>tmp_.txt
- del BGlist.txt
- ren tmp_.txt BGlist.txt
- 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 编辑 ]
作者: hmlstfqtl 时间: 2010-4-20 09:02
寒星的批写的甚好甚强大
全部文件都定义到变量 是很好 而且随即提取和输出也做得很完美
先谢谢寒星了
在此 希望 寒星 再帮写一个 按照本帖说明 的P处理 我想仔细研究研究 谢谢了
作者: hanyeguxing 时间: 2010-4-20 16:23
原帖由 hmlstfqtl 于 2010-4-20 09:02 发表
寒星的批写的甚好甚强大
全部文件都定义到变量 是很好 而且随即提取和输出也做得很完美
先谢谢寒星了
在此 希望 寒星 再帮写一个 按照本帖说明 的P处理 我想仔细研究研究 谢谢了
把我的代码里的:- for /f "delims=" %%i in ('dir /a-d /b /s "*.png"') do call:han "%%~fi"
复制代码
改成- for /f "delims=" %%i in (BGList.txt) do call:han %%i
复制代码
把我的代码里的:- 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=="
复制代码
改成- for /f "delims=" %%i in (FList.txt) do set "xing_%%~i=="
复制代码
不就可以了吗????
[ 本帖最后由 hanyeguxing 于 2010-4-20 16:29 编辑 ]
作者: hmlstfqtl 时间: 2010-4-21 12:45
执行的时候会有一些路径出现错误 怎么把错误显示隐藏起来 >2nul 加到哪里
作者: hmlstfqtl 时间: 2010-4-21 12:52
突然发现文件夹太多了!!!寒一个 - -
也没有办法只搜索1层的目录层次
如
E:\电影\笔记
E:\电影\死亡
E:\电影\不要搜索我
只搜索到 E:\电影 电影文件夹下的子文件就不要了 反正2层的目录基本不怎么打开
作者: hanyeguxing 时间: 2010-4-21 14:16
原帖由 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 编辑 ]
作者: hmlstfqtl 时间: 2010-4-22 23:55
至此 终于结贴了。。谢谢各位的帮助 特别是寒星
这里发一个成品 谢谢大家 可以测试下 一切操作可逆 不会影响电脑 图片可以自己添加 推荐使用 快速 版本
这里就把成品给大家发出来
下载链接
http://www.uushare.com/user/gkass/file/2909732
下面是附件说明-
- 运行文件夹里的 !)生成.bat 即可在全盘文件夹里显示图片
- 运行过程切勿关闭运行窗口。
- 一切操作都是可逆的。
-
- 当不想要显示图片的时候 再运行一次 !)生成.bat 或者 !)删除.bat 即可
- 至于 !)快速.bat 是后面添加的 只搜索到1层目录
- 速度当然会很快 而且对系统的稳定不会有影响了
复制代码
华丽的分割线。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
===============================================================================================
下面贴上成品的批处理内容-
- !)快速.bat
-
- @echo off&setlocal enabledelayedexpansion
- if exist "勿删.txt" (goto back) else (goto start)
-
- :back
- cls
- echo 现在开始删除生成的文件,操作期间一定不要关闭本窗口。
- echo 如本机文件夹过多的话,操作的时间就会较长,请耐心等待。谢谢!
- for /f "delims=" %%a in (勿删.txt) do if exist "%%a"desktop.ini del /f /a /q "%%a"desktop.ini & attrib -s %%a
- for /f "delims=" %%i in (勿删.txt) do if exist %%i\desktop.ini del /f /a /q %%i\desktop.ini & attrib -s %%i
- del /f /q /a 勿删.txt
- goto xing
- :start
- cls
- echo 如本机文件夹过多的话,操作的时间就会较长,请耐心等待。谢谢!
- for /f "skip=4" %%a in ('mountvol ^| find ":"') do if not exist %%a\desktop.ini echo %%a>>勿删.txt
- 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)
- for /f "delims=" %%i in ('dir /a /b /s "*.PNG"') do call:han "%%~fi"
- for /F "tokens=1,2* delims==:" %%i in ('set han_^|findstr /n .*') do set "BG_%%i=%%k"&set ye_BG=%%i
-
- for /f "delims=" %%i in (勿删.txt) do set "xing_%%~i=="
- 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
- 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!"
- >>"!gu!\Desktop.ini" echo.[{BE098140-A513-11D0-A3A4-00C04FD706EC}]
- >>"!gu!\Desktop.ini" echo.IconArea_Image=!BG_%%j!
- attrib +s +h +r "!gu!\Desktop.ini"
- )
-
- :xing
- exit
-
- :han
- set han=%random%%random%%random%
- if "!han_%han%!"=="" (set "han_%han%=%~1") else goto:han
复制代码
-
- !)生成.bat
-
- @echo off&setlocal enabledelayedexpansion
- if exist "勿删.txt" (goto back) else (goto start)
-
- :back
- cls
- echo 现在开始删除生成的文件,操作期间一定不要关闭本窗口。
- echo 如本机文件夹过多的话,操作的时间就会较长,请耐心等待。谢谢!
- for /f "delims=" %%a in (勿删.txt) do if exist "%%a"desktop.ini del /f /a /q "%%a"desktop.ini & attrib -s %%a
- for /f "delims=" %%i in (勿删.txt) do if exist %%i\desktop.ini del /f /a /q %%i\desktop.ini & attrib -s %%i
- del /f /q /a 勿删.txt
- goto xing
- :start
- cls
- echo 如本机文件夹过多的话,操作的时间就会较长,请耐心等待。谢谢!
- for /f "skip=4" %%a in ('mountvol ^| find ":"') do if not exist %%a\desktop.ini echo %%a>>勿删.txt
- 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)
- for /f "delims=" %%i in ('dir /a /b /s "*.PNG"') do call:han "%%~fi"
- for /F "tokens=1,2* delims==:" %%i in ('set han_^|findstr /n .*') do set "BG_%%i=%%k"&set ye_BG=%%i
-
- for /f "delims=" %%i in (勿删.txt) do set "xing_%%~i=="
- 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
- 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!"
- >>"!gu!\Desktop.ini" echo.[{BE098140-A513-11D0-A3A4-00C04FD706EC}]
- >>"!gu!\Desktop.ini" echo.IconArea_Image=!BG_%%j!
- attrib +s +h +r "!gu!\Desktop.ini"
- )
-
- :xing
- exit
-
- :han
- set han=%random%%random%%random%
- if "!han_%han%!"=="" (set "han_%han%=%~1") else goto:han
复制代码
-
- !)删除.bat
-
- @echo off&setlocal enabledelayedexpansion
- echo 如本机文件夹过多的话,操作的时间就会较长,请耐心等待。谢谢!
- echo 显示的错误也属于正常的,不必担心本操作失误造成系统出现问题。
- echo 运行窗口一定不要关闭,切记。
- del /f /q /a 勿删.txt >nul 2>nul
- 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
- for /f "delims=" %%a in (勿删.txt) do if exist "%%a"desktop.ini del /f /a /q "%%a"desktop.ini & attrib -s %%a
- for /f "delims=" %%i in (勿删.txt) do if exist %%i\desktop.ini del /f /a /q %%i\desktop.ini & attrib -s %%i
- del /f /q /a 勿删.txt
- exit
复制代码
[ 本帖最后由 hmlstfqtl 于 2010-4-23 08:44 编辑 ]
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |