无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 9777|回复: 21
打印 上一主题 下一主题

STRINGS/NSET在 纯DOS下对文本文件的操作方法

[复制链接]
跳转到指定楼层
1#
发表于 2009-4-24 10:38:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STRINGS NSET TXT.rar (11.84 KB, 下载次数: 683)
STRINGS常用方法:
1、把文本文件 LIST.TXT 包含的行数赋值给变量 LN
STRINGS LN=LINESIZE LIST.TXT
2、把文本文件 LIST.TXT 的大小传递给变量FS
STRINGS FS=FILESIZE LIST.TXT
3、读取文本文件 LIST.TXT 的第5行内容并赋值给变量 LN
STRINGS LN=READ LIST.TXT,5

4、把变量 N 在原有基础上+1 -1
STRINGS N=ADD %N%,1
STRINGS N=SUB %N%,1
5、把字符串 ABCDEFG 中第四个字符以及后面共3个字符传递给变量 LX   (DEF)
STRINGS LX=MID ABCDEFG,4,3
6、查找字符串 ABCDEFG D所在的位置并赋值给变量DX,如果没找到DX=0
STRINGS DX=FIND ABCDEFG,D
7、找出字符串 ABCD EFG HIJ KLMN 中第二个单词并赋值给变量L2
STRINGS L2=PARSE ABCD EFG HIJ KLMN ,2

应用举例:逐一显示文件 LIST.TXT 各行内容
@ECHO OFF

REM 读取LIST.TXT大小如果是0就转入 ERROR
STRINGS FS=FILESIZE LIST.TXT
IF %FS%*==0* GOTO ERROR

REM 读取 LIST.TXT 行数 并用N作计数器以循环方式显示 LIST.TXT各行内容。
STRINGS L=LINESIZE LIST.TXT

STRINGS L=ADD %L%,1
SET N=0
:LOOP
STRINGS N=ADD %N%,1
STRINGS LX=READ LIST.TXT,%N%
ECHO %LX%
IF %N%*==%L%* GOTO END
GOTO LOOP

:ERROR
ECHO LIST.TXT IS NULL

:END
SET FS=
SET L=
SET N=
SET LX=

---------------------------------------------
NSET 的常用方法:
1、把某一命令的执行结果传递给变量。
A. DIR 命令执行结果第7行中的第2个单词传递给变量 DIRX
DIR  /A /S |NSET /L7 DIRX=$2
B.把当前路径传递给变量 CDX
CD |NSET CDX=$0
2、获取 LIST.TXT 文件第5行第2个单词的内容并赋值给变量 L52
NSET /L5 L52=$2 <LIST.TXT

举例:显示出 LIST.TXT 文件中第二个单词是 SYSTEM 的行的内容。
@ECHO OFF

REM 读取LIST.TXT大小如果是0就转入 ERROR
STRINGS FS=FILESIZE LIST.TXT
IF %FS%*==0* GOTO ERROR

REM 读取 LIST.TXT 行数 并用N作计数器以循环方式显示 LIST.TXT中第二个单词是

REM  SYSTEM 的行的内容,每找到一个符合条件的行,就把变量M在原有基础上+1
STRINGS L=LINESIZE LIST.TXT
STRINGS L=ADD %L%,1
SET N=0
SET M=0
:LOOP
STRINGS N=ADD %N%,1
STRINGS LX=READ LIST.TXT,%N%

REM STRINGS LX2=PARSE %LX%,2
NSET /L%N% LX2=$2 <LIST.TXT
IF %LX2%*==SYSTEM* ECHO %LX%
IF %LX2%*==SYSTEM* STRINGS M=ADD %M%,1
IF %N%*==%L%* GOTO END
GOTO LOOP

:ERROR
ECHO LIST.TXT IS NULL

:END
IF %M%*==0* ECHO No found!
SET FS=
SET L=
SET N=
SET M=
SET LX=
SET LX2=



举例:把GDISK执行结果中包含硬盘信息的语句传递给文件 DISKN2.TXT
@echo off
REM 把硬盘信息用GDISK 传递个文件 DISKN.TXT
gdisk >diskn.txt
REM 如果存在DISKN2.TXT 就删除之
if exist diskn2.txt del diskn2.txt >nul
REM 获取DISKN.TXT文件行数并用N做计数器逐行判断,并把需要的信息传递给DISKN2.TXT
REM 如果该行前两个字符是 NO 说明没有硬盘,就退出脚本
REM 如果该行强四个字符是 DISK或者该行为空  说明是文件头第一/二行内容,不予传递而进入下一次循环。
strings ln=linesize diskn.txt
strings ln=add %ln%,1
set n=0

:loop1
if %n%==%ln% goto end
strings n=add %n%,1
strings l=read diskn.txt,%n%
strings lx=left %l%,2
IF *%Lx%*==*No* goto end
strings lx=left %l%,4
if *%lx%*==*Disk* goto loop1
if *%l%*==** goto loop1
echo %l% >>diskn2.txt
goto loop1


:end
set l=
set ln=
set n=
set lx=
if exist diskn.txt del diskn.txt >nul


[ 本帖最后由 dos时代菜鸟 于 2009-4-24 15:54 编辑 ]
2#
发表于 2009-4-24 10:45:55 | 只看该作者
好教程,支持,继续。

回复

使用道具 举报

3#
发表于 2009-4-24 10:49:58 | 只看该作者
这两个工具是dos下文本集字符处理的利器,用处不小。
回复

使用道具 举报

4#
 楼主| 发表于 2009-4-24 10:58:25 | 只看该作者
有了这两软件,纯DOS下的BAT方式文本文件操作就容易多了,一些CMD下的类似功能在纯DOS下也可以实现了。
回复

使用道具 举报

5#
发表于 2009-4-24 11:12:15 | 只看该作者
转帖一份dos联盟的strings的说明:

=====转帖内容开始=======================

STRINGS 的语法和作用,麻烦各位点评。呵呵!!#1     作者: insert     时间: 2004-11-10 00:00

     上次经过Climbing的指导,终于清楚了STRINGS的强大功能。小弟手头没英文字典,所以只能借助翻译软件,总算把STRINGS的一些子命令的用法搞清楚了,具体请看下面的介绍。由于小弟不懂E文,所以有错或漏的,请各位能帮忙指出并补上。谢谢!!
      STRINGS是个很好的批处理增强工具,功能很多,如字符操作,文件操作,内存操作等,并可将值输出到目标变量中。可以使用DOS提示符下输入STRINGS /?查看其所有的使用参数。
STRINGS/?  (查看STRINGS的子命令列表)
下面是STRINGS的子命令列表:
LEFT                  RIGHT            MID            LENGTH           FIND                FINDC        
LOWER             UPPER         CHAR         VAL                FILEDRIVE        FILEDIR      
FILENAME         FILEEXT        PARSE        ADDCOMMAS  REPEAT           READ         
WRITE               FILESIZE      LINESIZE     TRUENAME     FILEDATE        FILETIME     
VER                  ASK             INWIN           2FCHECK       ENVFREE         ENVSIZE      
MASTERVAR    LOCALVAR    TRUEVER     FILES             LASTDRIVE       CODEPAGE     
COUNTRY         BIOSDATE     GETKEY       LOCALENV     MASTERENV    ADD         
SUB                 MUL               DIV               AND               OR                   XOR         
NOT                 CONVERT      PEEK           POKE              IN                    OUT         
INTERRUPT      SCAN            DAY             MONTH           DATE                TIME         
MEMTOTAL      MEMFREE     XMSTOTAL   XMSFREE        XMSVER           EMSTOTAL     
EMSFREE       EMSVER       UMBLARGE  STRINGSVER   INSTALLED       HELP         
查看某个特定命令的帮助请输入:  STRINGS HELP 子命令
                       例如:STRINGS HELP LEFT  (将显示LEFT子命令的详细用法)
下面是它们的详细语法和作用,〈 〉内是作用说明。
1.STRINGS [目标变量=]LEFT 源字符串 要取的字符数量  〈从左边取源字符串的指定字符数量〉
2.STRINGS [目标变量=]RIGHT 源字符串 要取的字符数量 〈从右边取源字符串的指定字符数量〉
3.STRINGS [目标变量=]MID 源字符串 起止数,终止数     〈从中央取源字符串〉
4.STRINGS [目标变量=]LENGTH 源字符串        〈返回源字符串的字符长度〉         5.STRINGS [目标变量=]FIND 源字符串 字符     〈从源字符中查找指定的字符〉
6.STRINGS [目标变量=]FINDC 源字符串 字符    〈从源字符中查找指定的字符,区分大小写〉
7.STRINGS [目标变量=]LOWER 源字符串       〈将源字符串中的大写字母转换成小写字母〉
8.STRINGS [目标变量=]UPPER 源字符串       〈将源字符串中的小写字母转换成大写字母〉
9.STRINGS [目标变量=]CHAR 字符 [字符1] [字符2]... 〈将字符转换成ASCII数字〉
10、STRINGS [目标变量=]VAL 数字 [数字1] [数字2]...  〈将数字转换成ASCII字符〉
11、STRINGS [目标变量=]FILEDRIVE 文件名             〈返回文件名所在的盘符〉
12、STRINGS [目标变量=]FILEDIR 文件名               〈返回文件名所在的目录〉
13、STRINGS [目标变量=]FILENAME 源文件名    〈返回源文件名的文件名,不要扩展名〉
14、STRINGS [目标变量=]FILEEXT  源文件名     〈只返回源文件名的扩展名〉
15、STRINGS [目标变量=]ADDCOMMAS 数字    〈将数字每隔三位用逗号隔开〉
16、STRINGS [目标变量=]REPEAT 重复多少,字符或数字 〈将字符或数字进行指定的重复〉
17、STRINGS [目标变量=]READ 文件名,行数           〈读取文件中指定行数的内容〉
18、STRINGS [目标变量=]WRITE 文件名,字符          〈将字符追加到文件中〉
19、STRINGS [目标变量=]FILESIZE 文件名            〈返回文件的大小〉
20、STRINGS [目标变量=]LINESIZE 文件名            〈返回文件内容的总行数〉
21、STRINGS [目标变量=]TRUENAME 文件名            〈返回文件的完整路径〉
22、STRINGS [目标变量=]FILEDATE 文件名            〈返回文件的修改日期〉
23、STRINGS [目标变量=]FILETIME 文件名            〈返回文件的修改时间〉
24、STRINGS [目标变量=]VER                        〈返回当前系统的DOS版本号〉
25、STRINGS [目标变量=]ASK 提未字符串[,最大输入数][,1=*显示 2=不显示] 〈对话〉
26、STRINGS [目标变量=]INWIN            〈如果在WINDOWS中的DOS窗口中运行则返回1〉
27、STRINGS [目标变量=]ENVFREE     〈返回环境变量空间的空闲字节数〉
28、STRINGS [目标变量=]ENVSIZE       〈返回环境变量空间的总共大小〉
29、STRINGS [目标变量=]TRUEVER      〈返回当前DOS的真实版本号〉
30、STRINGS [目标变量=]FILES            〈返回当前同时访问的文件数量〉
31、STRINGS [目标变量=]LASTDRIVE    〈返回当前系统可以访问最后有效的驱动器字母〉
32、STRINGS [目标变量=]CODEPAGE   〈返回当前系统活动的长文件代码页〉
33、STRINGS [目标变量=]COUNTRY      〈返回当前系统设置的国家代码〉
34、STRINGS [目标变量=]BIOSDATE     〈返回BIOS出厂的日期〉
35、STRINGS [目标变量=]GETKEY        〈返回按键的ASCII代码〉
36、STRINGS [目标变量=]ADD 数字1,数字2[,数字3]...  〈对数字进行+运算〉
37、STRINGS [目标变量=]SUB 数字1,数字2[,数字3]...  〈对数字进行-运算〉
38、STRINGS [目标变量=]MUL 数字1,数字2[,数字3]...  〈对数字进行×运算〉
39、STRINGS [目标变量=]DIV 数字1,数字2[,数字3]...   〈对数字进行÷运算〉
40、STRINGS [目标变量=]AND 数字1,数字2[,数字3]... 〈对数字进行“逻辑与”运算〉
41、STRINGS [目标变量=]OR 数字1,数字2[,数字3]...   〈对数字进行“逻辑或”运算〉
42、STRINGS [目标变量=]NOT 数字1,数字2[,数字3]... 〈对数字进行“逻辑取反”运算〉
43、STRINGS [目标变量=]MEMTOTAL                    〈返回系统总共的常规内存大小〉
44、STRINGS [目标变量=]MEMFREE                     〈返回系统空闲的常规内存大小〉
45、STRINGS [目标变量=]XMSTOTAL                     〈返回系统总共的扩展内存大小〉
46、STRINGS [目标变量=]XMSFREE                      〈返回系统空闲的扩民内存大小〉
47、STRINGS [目标变量=]XMSVER             〈返回当前扩展内存使用的驱动程序的版本号〉
48、STRINGS [目标变量=]EMSTOTAL         〈返回系统总共的扩充内存大小〉
49、STRINGS [目标变量=]EMSFREE           〈返回系统空闲的扩充内存大小〉
50、STRINGS [目标变量=]EMSVER             〈返回当前扩充内存使用的驱动程序的版本号〉
51、STRINGS [目标变量=]STRINGSVER       〈返回STRINGS的版本号〉
以下是小弟还没弄懂的子命令,麻烦那位知道其作用的请补上。谢谢!!
PARSE       2FCHECK  MASTERVAR  LOCALVAR  LOCALENV   MASTERENV    XOR
CONVERT   PEEK        POKE             IN                OUT              INTERRUPT      SCAN
DAY            MONTH     DATE             TIME             UMBLARGE  INSTALLED
    再次感谢 Climbing !   各位喜欢要顶哦!!!  呵呵!!!
=====转帖内容结束=======================
回复

使用道具 举报

6#
 楼主| 发表于 2009-4-24 11:24:12 | 只看该作者
MASTERVAR  LOCALVAR  LOCALENV   MASTERENV   应该是设置内存种类吧
PEEK 发音喇叭控制
IN   OUT  INTERRUPT   SCAN  硬件端口之类的东西
DAY  MONTH   DATE  TIME 返回时间日期星期之类
UMBLARGE  INSTALLED 返回CONFIG 中相应设置
回复

使用道具 举报

7#
发表于 2009-4-24 13:54:50 | 只看该作者
感谢!收下了,要学习的东西很多,慢慢来看
回复

使用道具 举报

8#
发表于 2009-4-24 14:26:18 | 只看该作者
收藏先,  DOS下的批处理字符处理只能靠工具实现了。
回复

使用道具 举报

9#
发表于 2009-4-24 18:59:20 | 只看该作者
好及时的教程,刚好最近想结合AEFDISK 搞点东西用用。。。
回复

使用道具 举报

10#
发表于 2009-4-24 19:22:10 | 只看该作者
不错的东西,谢谢分享!
回复

使用道具 举报

11#
发表于 2009-4-24 19:44:07 | 只看该作者
学习学习在学习,谢谢了。
回复

使用道具 举报

12#
发表于 2009-4-24 22:30:35 | 只看该作者
还有一个LOMD和NSET的功能差不多.
LMOD一般用于批量文本格式化处理.
NSET一般用于单个处理.(提取某个值作为变量)

各有优缺点.一般情况下LMOD可以代替NSET.
回复

使用道具 举报

13#
发表于 2009-4-25 03:46:30 | 只看该作者
dos时代菜鸟 已成老鸟了...
回复

使用道具 举报

14#
发表于 2009-4-25 13:11:54 | 只看该作者

回复 #13 135956 的帖子

哈哈。。。本来就是只老鸟。。。之前在PE区就认识到他是写脚本方面的好手。。。
回复

使用道具 举报

15#
发表于 2009-4-26 10:06:57 | 只看该作者
在实际使用时发现,用strings取文件总行数时,比实际的行数要少,此时需要修正。
不知其他人使用中有无此问题。
回复

使用道具 举报

16#
 楼主| 发表于 2009-4-26 10:33:32 | 只看该作者
原帖由 lianjiang 于 2009-4-26 10:06 发表
在实际使用时发现,用strings取文件总行数时,比实际的行数要少,此时需要修正。
不知其他人使用中有无此问题。


所以才会 strings ln=add %ln%,1 的办法修正阿。
回复

使用道具 举报

17#
发表于 2009-4-26 11:00:28 | 只看该作者
原帖由 dos时代菜鸟 于 2009-4-26 10:33 发表


所以才会 strings ln=add %ln%,1 的办法修正阿。


呵呵,没看你的顶楼脚本。

以前使用strings处理分区信息时发现的。现已改用主要用gawk处理了。
回复

使用道具 举报

18#
发表于 2010-1-3 22:07:37 | 只看该作者
遇到问题了:
用right和left都不能正确截取字符

omnifs dir 1.3:\log\>log.txt
strings aa=read log.txt,1
strings bb=right %aa%,7
strings cc=left %aa%,3
echo %bb%
echo %cc%

结果全部显示为log.txt第一行左起两段字符(实机未截图)

log.txt第一行内容大致格式如下:
08-12-09 12:23a 356,234,234 readme.txt

运行结果均为“08-12-09 12:23a 356”,不知何故,在虚拟机里是正常的,但在实机就会出问题,超级郁闷啊!
请高手帮忙分析分析!在此谢过了!

[ 本帖最后由 hhffnn 于 2010-1-5 18:24 编辑 ]
回复

使用道具 举报

19#
 楼主| 发表于 2010-1-3 22:47:42 | 只看该作者
用nset
比如:
nset /l1 /p1,8 aa=$0 <log.txt
表示把log.txt 文件中的第一行的左边1~8个字符赋予给变量 aa
回复

使用道具 举报

20#
 楼主| 发表于 2010-1-3 22:58:39 | 只看该作者
原帖由 hhffnn 于 2010-1-3 22:07 发表
遇到问题了:
用right和left都不能正确截取字符

omnifs dir 1.3:\log\>log.txt
strings aa=read log.txt,1
strings bb=right %aa%,7
strings cc=left %aa%,3
echo %bb%
echo %cc%

结果全部显示为lo ...


我分析可能是:

因为 变量aa中有 逗号,
strings bb=right %aa%,7
这一句相当于:
strings bb=right 08-12-09 12:23a 356,234,234 readme.txt,7

结果,有效命令相当于:
strings bb=right 08-12-09 12:23a 356,234
回复

使用道具 举报

21#
发表于 2010-1-5 16:59:32 | 只看该作者
多谢DOS时代菜鸟!看来strings不能用来处理有逗号的文本,美中不足啊!不过即使有逗号,用nset配合strings基本都可以解决。再次感谢!
回复

使用道具 举报

22#
发表于 2011-7-13 17:47:01 | 只看该作者
谁能发个NSET啊,急需
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-28 14:26

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表