![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-13 05:01 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 如何在批处理中插入多个参数,并有随机和顺序的要求,谢谢! |
| 可打印版本 4,359 / 16 |
| 第1楼 xinshou123 | 发表于 2006-11-01 08:43 |
| 初级用户 发帖 8 积分 20 | |
|
如何在批处理中插入多个参数,并有随机和顺序的要求,谢谢! 在下菜鸟新手,想请教个问题:
是个批处理参数传递问题:格式如下, 有4个TXT文件: A1.TXT __________________________ AAAAAAAAAA AAAAAAAA AAAAAAA AAAAAAAAA AAAAAAAAAAAAAAA ..................... A2.TXT ____________________________ BBBBBBBBB BBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBB .................. A3.TXT ____________________________ CCCCCCCCCCC CCCCC HHHHHHH CCCCCCCCCCCCCC ............ A4.TXT ___________________________ DFGGGGGGGGGG GFHHHH FGHGFH ................... 我想实现的结果是:A1.TXT的内容从第一行开始顺序传递作为,传递到最后一行批处理脚本结束,同时在文挡文件A2.TXT;A3.TXT;A4.TXT中各随机提取一行,分别作为 ,.格式如下: CV.EXE [ Last edited by namejm on 2006-11-2 at 08:55 AM ] |
|
| 第2楼 namejm | 发表于 2006-11-01 10:39 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
请问A2.TXT;A3.TXT;A4.TXT这三个文件中,每个文件的行数在一个什么范围内?
|
|
| 第3楼 9527 | 发表于 2006-11-02 04:51 |
| 银牌会员 发帖 438 积分 1,185 来自 北京 | |
|
@echo off&setlocal
for /f %%a in ('find /c /v "" ^<a2.txt') do set a=%%a for /f %%a in ('find /c /v "" ^<a3.txt') do set b=%%a for /f %%a in ('find /c /v "" ^<a4.txt') do set c=%%a for /f "delims=" %%x in (a1.txt) do call :shit %%x goto :eof :shit set /a x=%random%%%a+1 for /f "tokens=1* delims=:" %%a in ('findstr /n . a2.txt^|findstr "^%x%:.*$') do set "h=%%b" set /a x=%random%%%b+1 for /f "tokens=1* delims=:" %%a in ('findstr /n . a3.txt^|findstr "^%x%:.*$') do set "i=%%b" set /a x=%random%%%c+1 for /f "tokens=1* delims=:" %%a in ('findstr /n . a4.txt^|findstr "^%x%:.*$') do set "j=%%b" echo %1 %h% %i% %j% goto :eof 没有考虑行中的特殊符号还有空行,懒得写,有点累了 [ Last edited by 9527 on 2006-11-3 at 01:27 AM ] |
|
| 第4楼 xinshou123 | 发表于 2006-11-02 08:42 |
| 初级用户 发帖 8 积分 20 | |
|
你好,版主:
A2.TXT;A3.TXT;A4.TXT这三个文件中,每个文件的行数在20-30行左右 麻烦您了! |
|
| 第5楼 xinshou123 | 发表于 2006-11-02 08:48 |
| 初级用户 发帖 8 积分 20 | |
Originally posted by 9527 at 2006-11-2 04:51: 你好,9527,本人很菜鸟,能不能帮忙写详细点,先谢谢了!! |
|
| 第6楼 namejm | 发表于 2006-11-02 09:34 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
3F的 'findstr /n . a2.txt^|findstr /b %x% 语句不是十分保险,举个极端的例子,如果某行内容含有随机生成的所有%x%的话,则始终会显示这一行,而不会显示随机的行(这个例子举得不太妥当,请看8F和12F的分析),我来个容易看懂点的代码:
[ Last edited by namejm on 2006-11-3 at 01:31 AM ] |
|
| 第7楼 youxi01 | 发表于 2006-11-02 12:40 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
@echo off & set /a a=1
set files=test1.txt test2.txt test3.txt test4.txt setlocal enabledelayedexpansion for %%i in (%files%) do call :Config %%i set /a a=0 for %%i in (%files%) do set /a a+=1 & call :Pick_up %%i for %%i in (%var1% %var2% %var3% %var4%) do echo %%i pause>nul & goto :eof ::获取文本的行数 :Config for /f %%a in ('find /c /v "" ^<%1') do (set /a num%a%=%%a & set /a a+=1 & goto :eof) ::利用more达到跳过指定行的目的(而且可以跳过0行,而使用skip则不行!) :Pick_up set /a skipline=%random% %% !num%a%! set /a sk=%skipline%+1 for /f "delims=" %%i in ('more +%skipline% %1') do ( set var%a%=%1@第%sk%行@:%%i & goto :eof) 说明:在6F、3F的基础上得来! 程序在“最正常情况”、XP PRO下测试通过! |
|
| 第8楼 9527 | 发表于 2006-11-02 23:01 |
| 银牌会员 发帖 438 积分 1,185 来自 北京 | |
|
举个极端的例子,如果某行内容含有随机生成的所有%x%的话???
我不明白他说的是什么意思?是怕行里有相同的数字还是什么其他的东西? 我用FINDSTR /B 数字的模式应该不会影响到吧,/B 在一行的开始匹配模式 |
|
| 第9楼 youxi01 | 发表于 2006-11-02 23:07 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
也就是说你的代码是根据行号(对应的数字)来获取参数内容的。打个比方:
你现在要获取第5行的内容,根据你的程序,就会查找含有5的行,第5行肯定有5,但是在第四行的内容也可能含有5,这样的话可能导致误判啊。 |
|
| 第10楼 9527 | 发表于 2006-11-02 23:12 |
| 银牌会员 发帖 438 积分 1,185 来自 北京 | |
|
楼上的,我明白,呵呵,那/B干什么用的啊?什么叫开始匹配模式啊?我想你还是好好实验一下FINDSTR命令吧
|
|
| 第11楼 youxi01 | 发表于 2006-11-02 23:59 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
收到,谢了。看样子对各命令的开关,要狠狠补补课才行啊!
|
|
| 第12楼 namejm | 发表于 2006-11-03 00:53 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
Originally posted by 9527 at 2006-11-2 23:01: 仔细想了一下,我所举的这个例子不太妥当,但是,假设极端的情况是这样的:当 %x% 分别连续取到 1、12、123……的时候,那么,findstr /b 始终会匹配到行数为 12345 这样的行吧?这个时候岂不是难以取到随机的行了吗?更极端一点,假设总行数为 123456789,而随机取到的数字一直是 1、2、3、4、5、6、7、8、9、12、23、……123、234…… 中的任意一个,岂不是始终匹配第 123456789 行了呢? 以上仅属推测,没有测试。 |
|
| 第13楼 9527 | 发表于 2006-11-03 01:25 |
| 银牌会员 发帖 438 积分 1,185 来自 北京 | |
|
3F代码已经更新,对不住楼主了............
|
|
| 第14楼 namejm | 发表于 2006-11-03 06:21 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
我又要跳出来挑9527的漏洞了,希望9527别觉得我老是和你过不去^_^
findstr /n . a2.txt^|findstr "^%x%:.*$ 的格式还是难以尽如人意:假设最后一行不是空行,那么,它将永远无法提取最后一个字符行,这应该是 findstr 在查找行尾时的一个小bug。请测试以下代码: 请分别用只有 123:456 这一行内容的test.txt和最后一行为空行、其中一行为 123:456 的test.txt来测试。 [ Last edited by namejm on 2006-11-3 at 06:24 AM ] |
|
| 第15楼 xinshou123 | 发表于 2006-11-03 08:20 |
| 初级用户 发帖 8 积分 20 | |
|
谢谢版主,谢谢9527,谢谢youxi01
我只学过最简单的批处理,虽然还不能完全看懂所有代码,但各位代码已经能满足我的要求结果,谢谢! 谢谢大家的帮助!!! |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |