![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-09 22:48 |
共 47,811 主题排行 / 349,897 发帖 / 今日 2 篇 / 48,255 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » (已结)請問如何抓取文件中的某一行特定文字 |
| 可打印版本 3,379 / 12 |
| 第1楼 dosfroum | 发表于 2005-10-26 01:34 |
| 初级用户 发帖 54 积分 154 | |
|
(已结)請問如何抓取文件中的某一行特定文字 請問我下ipconfig > IP.txt
但是我只需要 192.168.1.1 這張網路卡的名字 也就是 IP Address. . . . . . . . . . . . : 192.168.1.1 往上數第4行 要把後面這串文字"Realtek RTL8169/8110 Family Gigabi"設為變數 set CardName=Realtek RTL8169/8110 Family Gigabit 請問要如何做呢 因為卡名會變 但是ip的前面兩組字串不會變 也就是 192.168是固定的 謝謝 [ Last edited by willsort on 2005-10-27 at 20:09 ] |
|
| 第2楼 JonePeng | 发表于 2005-10-26 09:25 |
| 金牌会员 发帖 1,883 积分 4,562 来自 广东广州 | |
|
配合外部命令LMOD可以做到
|
|
| 第3楼 无奈何 | 发表于 2005-10-26 13:55 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
按照你的思路一步步转化为批处理语言就行了。以下是按照你的思路的批处理实现:
关于 set /a line-=5句为什么减 5,实验发现 ipconfig 会在每句后添加换行符,而使其间距倍翻,你可以测定重设其值。 |
|
| 第4楼 willsort | 发表于 2005-10-26 14:53 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re JonePeng:
严格意义上说,LMOD并非外部命令,而是第三方工具软件。所以它才不包含在MSDOS6.22/7.10的安装盘中。 Re 无奈何: 并非一定要以192.168.1.1起始来取值的,直接find “Description”然后取第一行的值即可。例: for /f "delims=: tokens=2" %s in ('ipconfig /all ^| find "Des" ^| find /v "WAN"') do @set CardName=%s |
|
| 第5楼 无奈何 | 发表于 2005-10-26 15:49 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
:to willsort
含有双、多网卡的机器,如此可能会得到非预想的值,我觉得楼主的思路还是稳妥地。 |
|
| 第6楼 dosfroum | 发表于 2005-10-26 20:11 |
| 初级用户 发帖 54 积分 154 | |
Originally posted by willsort at 2005-10-26 14:53: 版主阿 我之前有提到 為何要用192.168起始 因為一台電腦可能有兩張以上的網卡 但是只有那個ip是固定的 所以..一定要由那行起始下去算 才能得到正確網卡的名稱 請問有何方法修改呢 妳的批次檔可以正確執行 但是 要把 %s 改成 %%s 才對^^" [ Last edited by dosfroum on 2005-10-26 at 20:56 ] |
|
| 第7楼 dosfroum | 发表于 2005-10-26 20:28 |
| 初级用户 发帖 54 积分 154 | |
Originally posted by 无奈何 at 2005-10-26 13:55: 不會動 不會動 一堆錯誤還沒領悟出來原因 可以大概解釋一下嗎 謝謝 我有很努力的查了 但是看不出端倪來 delims=xxx - 指定分隔符號的集合。 這會取代 預設的空白與定位字元的分隔符號集合。 tokens=x,y,m-n - 指定每一行的哪些文字串應該被 傳到 for 的內部以用來進行每一個重複操作。 這會導致額外的變數名稱被配置。 m-n 格式代表一個範圍, 指定了第 m 個到第 n 個字串項。 如果在 tokens= 字串的最後一個字元是 星號,則會配置一個額外的變數 來接收最後一個字串項被分析後 的其它文字。 findstr /? 在檔案中搜尋字串。 FINDSTR filename] /B 如果是在行的開端,則符合類型。 /E 如果是在行的尾端,則符合類型。 /L 逐字使用搜尋字串。 /R 使用搜尋字串為一般表示式。 /S 在現存目錄及所有的子目錄中 搜尋符合的檔案。 /I 指定搜尋不區分大小寫。 /X 列印完全符合的行數。 /V 只列印不含相符字串的行數。 /N 列印每一行符合的行數前的行編號。 /M 只列印包含相符字串的檔案的檔案名稱。 /O 列印每一個相符行之前的字元位移。 /P 略過沒有可列印字元的檔案 /F:file 從指定的檔案讀取檔案清單 (/ 代表主控台)。 /C:string 使用特定的字串作為逐字搜尋的字串。 /G:file 從指定的檔案取得搜尋字串(/ 代表主控台)。 strings 要搜尋的文字。 filename 指定要搜尋的一個或多個檔案。 除非引數的字首有 /C ,否則請以空格將多重搜尋 字串分開。例如,'FINDSTR "hello there" x.y' 將會在檔案 x.y 中搜尋 "hello",或 "there"。'FINDSTR /C:"hello there" x.y' 將會在檔案 x.y 中搜尋 "hello there"。 [ Last edited by dosfroum on 2005-10-26 at 21:10 ] |
|
| 第8楼 dosfroum | 发表于 2005-10-26 21:31 |
| 初级用户 发帖 54 积分 154 | |
|
搞定 原來是 () 的位置影響很大
續問 可法幫忙解釋 delims=xxx tokens=x,y,m-n 這兩個參數 集%%c代表意思 因為我想要試著顯示出該行 IP 但是都顯示:以前的東西 請幫忙解惑 結果只顯示這樣 @@a |
|
| 第9楼 dosfroum | 发表于 2005-10-26 21:44 |
| 初级用户 发帖 54 积分 154 | |
|
總合整理
setlocal,endlocal <<< 代表什麼意思?? delims=: 表示已冒號做區分 tokens=2 表示用冒號區分成兩段後 取後面那段 tokens=1,2,3 <<< 代表什麼意思?? %%c <<<<<<這個是從哪來的 抓出來的卡名有多一個空白 我的解決方式是 請問 有告好的方法嗎 [ Last edited by dosfroum on 2005-10-26 at 21:56 ] |
|
| 第10楼 无奈何 | 发表于 2005-10-26 23:25 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
1、setlocal,endlocal 表示在其区间内使用自己的环境变量。
2、tokens=1,2,3 delims=: %%a ,表示获取以 : 分割的前3个字符串,分别付值给 %%a,%%b,%%c,后两个是系统自动分配的。 3、多出的空白字符,像你这样取子字符串,排除掉就可以了。 其实你产生问题联机帮助里都有说明,for /? 将显示的内容反复读几遍,for是很强大的命令值得花点功夫学习。 |
|
| 第11楼 willsort | 发表于 2005-10-27 01:28 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re 无奈何 & dosfroum:
双网卡的情况确实会有问题,多网卡的情形应该很难碰到吧?不过多个网络连接倒是很可能的,所以需要再做一些变化。但是192.168的网卡能说明什么问题呢?是说它是本地连接的网卡(局域网卡)吗?我的本地网卡是10.0起首的。 我在4楼写的例子是在命令行运行的,而非是批处理,从set前面的@就应该可以看出来;如果是批处理,我会让它结构上更完整和严谨一些,并且加上[code]和[/code]的代码修饰符。 至于 无奈何 兄的代码,仍然可以再简化一下,不用取行号,只用一个FOR即可将之析出。思路如下:分析IPCONFIG的每行输出,如果遇到Description...则取后面的网卡名,如果遇到192.168...则跳出循环,具体代码就不提供了。 去除串前空白,用set是最简单的;取IP的那句是因为tokens的问题,应该是tokens=2,这样%%a才会被赋予第2个“令牌”(使用delims切分出来的字符串子串)的值,你的用法使IP地址赋给了%%b。 至于FOR的中文联机帮助,我建议只看前半部分,后半部分明显是未经校正过的机器翻译结果,不仅语法晦涩难懂,而且给出的usebackq的例句是错误的,不如不看。当然如果你的英文水平可以,可以chcp 437后浏览其英文版。 FOR是很强大,也因此有很多BUG,我的建议是尽量少用usebackq,否则很容易碰到问题。而且我觉得,完全没有必要把许多功能都集中的FOR一个命令上的,这样只会带来命令的复杂性提高和健壮性下降,如果把它们按照功能分类拆分为几个单独的命令,那就既利于用户学习,也利于编程实现。 |
|
| 第12楼 dosfroum | 发表于 2005-10-28 00:31 |
| 初级用户 发帖 54 积分 154 | |
|
是有答案了 可是我可不可以續問
willsort版主 妳提到的思路 我想了一下午了 沒頭緒 那我一上午是在做啥呢?想另一個問題 因為某些電腦的網卡會抓到 #2 #3 .... 但是我只要前面那串字阿 不要#2 我有想過用 set 扣掉後面的數字 但是如果遇到沒有#2的狀態 卡名就會被截斷 附帶192.168的網路卡 並不能說明什麼 只是這個是我們設定的規則之一 所以剛好可以由這個字串來找尋 |
|
| 第13楼 willsort | 发表于 2005-10-28 10:53 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re dosfroum:
那试试这个程序吧 |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |