中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 批处理中用什么命令得到一个字符串的长度?
作者:
标题: 批处理中用什么命令得到一个字符串的长度? 上一主题 | 下一主题
xuyuansheng
初级用户





积分 20
发帖 8
注册 2007-1-17
状态 离线
『楼 主』:  批处理中用什么命令得到一个字符串的长度?

如题。
还有,在copy A + B, C的运用中,C文件的最后一行怎么会出现一个-> 或者在UE中观看时显示“口”字?不解。

2007-1-20 00:34
查看资料  发送邮件  发短消息 网志  OICQ (7867845)  编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 2 楼』:  

关于兄所说的出现黑方块的情况与COPY a+b 的原理分析如下:





先建立两个文件 a 与 b 做实验:  

  Quote:
C:\TEMP>copy con a
a
^Z
已复制         1 个文件。



C:\TEMP>copy con b
b
^Z
已复制         1 个文件。



C:\TEMP>dir a b
驱动器 C 中的卷是 DISK-C
卷的序列号是 4089-CA39

C:\TEMP 的目录

2007-01-19  12:11                 3 a

C:\TEMP 的目录

2007-01-19  12:12                 3 b

看到这两个文件长度均为 3 个字节。

键入的是一个字母,为什么是3个字节?
看一下Debug“看到的真实”文件内容:

  Quote:
-r
AX=0000  BX=0000  CX=0003  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0AF5  ES=0AF5  SS=0AF5  CS=0AF5  IP=0100   NV UP EI PL NZ NA PO NC
0AF5:0100 61            DB      61
-d
0AF5:0100  61 0D 0A 1E 8E 1E B4 96-B4 40 CD 21 1F BA 8C 8A   a........@.!....
0AF5:0110  73 03 E9 4E FF 2B C8 74-D0 F6 06 15 34 00 E4 0A   s..N.+.t....4...
0AF5:0120  F6 06 15 99 20 75 0A 80-3E D2 99 00 75 BB 49 74   .... u..>...u.It

上面绿色标示: 代表文件长度:3个字节
上面红色标示: 代表这个文件的内容——16进制。
        61 是刚才键入的字母 a 的 16进制ASCII码
        0D 0A 是: 回车、换行符(16进制的 ASCII码)

所以看到的文件长度是3(回车、换符看不到——即在文件编辑器内默认是不显示的,那个Office Word 例外)




当 COPY  A + B   C  操作时,即文件A的内容+文件B的内容=文件C的内容。

但是看下面输出信息文件 A的长度是3字节,文件B的长度是3字节,那么 A+B 就应该是 6 个字节。
C:\TEMP>copy a + b c
a
b
已复制         1 个文件。

C:\TEMP>dir c
驱动器 C 中的卷是 DISK-C
卷的序列号是 4089-CA39

C:\TEMP 的目录

2007-01-19  12:19                 7 c
但我们看到的确是  COPY A+B C  生成的文件C居然有7个字节(多出一个字节来,哈哈……)



那么这多出的一个字节就是兄所说的在记事本里看到的那个黑方块



下面分析它为什么会多出一个字节:


Debug  文件C 的内容如下:

  Quote:
-r
AX=0000  BX=0000  CX=0007  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0AF5  ES=0AF5  SS=0AF5  CS=0AF5  IP=0100   NV UP EI PL NZ NA PO NC
0AF5:0100 61            DB      61
-d
0AF5:0100  61 0D 0A 62 0D 0A 1A 96-B4 40 CD 21 1F BA 8C 8A   a..b.....@.!....
0AF5:0110  73 03 E9 4E FF 2B C8 74-D0 F6 06 15 34 00 E4 0A   s..N.+.t....4...
0AF5:0120  F6 06 15 99 20 75 0A 80-3E D2 99 00 75 BB 49 74   .... u..>...u.It
0AF5:0130  B8 BA 0D 8C EB 23 33 D2-87 D1 B8 01 42 CD 21 A3   .....#3.....B.!.
0AF5:0140  DF 99 89 16 E1 99 80 3E-C5 96 00 74 9C B4 40 CD   .......>...t..@.

上面绿色标示: 表示文件长度为7个字节。
上面红色标示: 表示这些内容是文件A+文件B的内容(6字节)
上面蓝色标示: 这才是多出的1个字节,也是兄记事本里看到的那个黑方块。
        它的16进制ASCII码为1A。
        它表示 COPY X+N   XN的文本文件的结束标置,用1A来标置。




但是,当你  COPY   /B   A+B   C 来操作时,(使用了 /B 二进制文件表示)这个黑方块就没有了。



这是因为 /B 参数是针对二进制文件来操作的,它不允许把任何“不相干”的控制码追加到目标文件中。
(其目的是为了保持目标文件的完整与正确性),常用于拼接文件等特殊操作,它是绝对不允许产生的目标文件中还含有什么控置码存在。



所以,拼接任何文件或是文本文件全可以使用  COPY /B 参数,这样安全。

但是,我们拼接的是文本文件,那么为什么非要用 /B 处理二进制方式来处理文本文件呢?
其实在计算看来,一切都是二进制,没有什么文本之说(那只是被程序“翻译”过来让我们一目了然而已的做法),所以全把它们当二进制文件用 /B 参数操作拼接就可以了~:)

[ Last edited by redtek on 2007-1-19 at 12:34 PM ]

   此帖被 +30 点积分        点击查看详情   
评分人:【 hxuan999 分数: +4  时间:2007-1-20 02:56
评分人:【 everest79 分数: +4  时间:2007-1-20 09:05
评分人:【 lxmxn 分数: +10  时间:2007-1-21 14:33
评分人:【 l23542 分数: +1  时间:2007-1-23 12:49
评分人:【 flyinspace 分数: +8  时间:2007-4-28 03:47
评分人:【 ttyp 分数: +2  时间:2007-5-17 09:46
评分人:【 lsjiang 分数: +1  时间:2009-3-17 00:45




    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2007-1-20 01:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 3 楼』:  


  RE Redtek :

  兄的讲解很精彩,能说说r命令里面的每个寄存器的作用么?像CX,DX,AX,BX之类的。现在看了例子才知道CX是存放文件字节大小数据的。

  改天给兄加分~


2007-1-20 02:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xuyuansheng
初级用户





积分 20
发帖 8
注册 2007-1-17
状态 离线
『第 4 楼』:  

谢二楼兄弟的精彩讲解。后来我用type来将文件A内容填进文件B了(TYPE A >> B),就不存在那些问题了。
感谢兄台。

2007-1-20 02:56
查看资料  发送邮件  发短消息 网志  OICQ (7867845)  编辑帖子  回复  引用回复
hxuan999
中级用户

DOS之日


积分 337
发帖 161
注册 2006-11-4
状态 离线
『第 5 楼』:  

精彩,给二楼加分.



for /f %%h in (`echo hxuan`) do for /f %%x in (`echo hxuan`) do if %%h==%%x nul
2007-1-20 02:57
查看资料  发送邮件  发短消息 网志  OICQ (33899867)  编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 6 楼』:  

多谢兄鼓励~:)



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2007-1-20 02:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xuyuansheng
初级用户





积分 20
发帖 8
注册 2007-1-17
状态 离线
『第 7 楼』:  

另外,对于这两种方法,哪一种处理方法速度更快呢?我是用小文件进行测试的,没有明显的差别。

2007-1-20 03:01
查看资料  发送邮件  发短消息 网志  OICQ (7867845)  编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 8 楼』:  

COPY /B  操作的目标文件共为300MB,时间:

  Quote:
@echo off
echo %time%
copy /b 1.rm + 2.rm ok.rm
echo %time%

共用时间:
开始时间: 14:12:59.98
结束时间: 14:13:16.04
另一种 TYPE A >> B 方法:
(退出刚才的CMD,再重新进入一个新的CMD窗口实验)

实验代码:
@echo off
echo %time%
type 1.rm >> 2.rm
echo %time%

开始时间: 14:15:32.40
结束时间: 14:15:46.42
(type 时间最长)
(原理:读A文件一行,追加到B文件尾,再重来循环……)

[ Last edited by redtek on 2007-1-19 at 02:17 PM ]



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2007-1-20 03:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 9 楼』:  

  请楼主不要在一个主题帖里问两个不甚相干的问题,如有多个问题请分成多个帖子发问,以便日后的搜索查询及论坛的管理。请修改本帖内容。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-1-20 03:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 10 楼』:  


  这个帖子居然花了半天时间才找到,汗……一直以为是在解答室。

  把分给兄补上~~


2007-1-21 14:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
caucfeiyu
初级用户




积分 108
发帖 35
注册 2007-4-12
来自 河北廊坊
状态 离线
『第 11 楼』:  

精彩,学习中!

2007-4-27 10:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 12 楼』:  

呵呵,精彩,加分



知,不觉多。不知,乃求知
2007-4-28 03:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: