中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何将一个文本中的最后若干个字节去掉
作者:
标题: 如何将一个文本中的最后若干个字节去掉 上一主题 | 下一主题
yy2372575
初级用户





积分 73
发帖 26
注册 2006-5-3
状态 离线
『楼 主』:  如何将一个文本中的最后若干个字节去掉

有人发了这个帖,我看了,代码如下
@echo off
if "%1"=="" echo 参数错误,请重新设定参数……&&pause&&goto :eof
    set file=%~s1
    set /a size=%~z1
    set /a num=%~z1-100
fsutil file setzerodata offset=%num% length=100 %file%
pause
但是不好使。而另一个代码
echo exit|%ComSpec%/kprompt a$_sub cx,64$_$_t$_w$_q$_|debug a.ini>nul
不知道为什么会在文本前开头产生乱码,没办法,只好旧调重弹,向高手求教!!!
说明:FOR命令在纯DOS下不好使

2006-12-21 01:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





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

哈哈……多谢yy2372575兄提醒~:)

我知道原因了,
原来是执行 MOV CX,64 把 CX寄存器值减去100时这条指命写在了地址 100H ,
虽然正确执行,但却把被装入的文件的前几个字符被这条指令给覆盖掉了~:)
所以,文件前几个字符乱码状态~:)



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

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-12-21 01:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





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

这回不会再覆盖文件前几个字节了,躲开了文件内容所在的地址~:)
处理文件大小不超过64KB:)
echo exit|%ComSpec% /k prompt a0001$_sub cx,64$_$_t$_w$_q$_|debug aa.ini>nul




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

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-12-21 01:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yy2372575
初级用户





积分 73
发帖 26
注册 2006-5-3
状态 离线
『第 4 楼』:  

不行呀!上回能删掉后面字节,可这个为什么对文件丝毫没有改动呢?麻烦你再试试行吗?谢谢

2006-12-21 03:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





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

不好意思,我忘了 “告诉” 代码执行哪个地址的指令了~:)
改过来了,这回试验可以了~:)
echo exit|%ComSpec% /k prompt a0001$_sub cx,64$_$_t=0001$_w$_q$_|debug aa.ini>nul




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

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-12-21 03:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yy2372575
初级用户





积分 73
发帖 26
注册 2006-5-3
状态 离线
『第 6 楼』:  

先谢谢大力帮助,这个代码也能删,可是为什么我把64换成10后,它删掉的字符不确定,显示的删掉是0000A,可文本里确删掉3--14个字符不确定?为什么呢?是不是对文本有什么输入要求呢?文本绝对只有英文不含汉字

2006-12-21 06:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





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

sub cx,64 相当于高级语言里的  CX = CX-64H(16进制运算)
那个64是16进制,换算成10进制就是 100 ,意思是当前所装入的这个文件的总长度减去100B(字节)的长度。

不管是文本还是可执行文件,它就减原文件长度的100个字节的长度。
(就是把当前指定的文件减少100Byte)

[ Last edited by redtek on 2006-12-20 at 05:15 PM ]



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

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-12-21 06:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yy2372575
初级用户





积分 73
发帖 26
注册 2006-5-3
状态 离线
『第 8 楼』:  

我试了连用ECHO向文本里输入删掉的字符也不确定,我试验了一下把64改成0C时删掉的是最后10个字符。不知道为什么!!!

2006-12-21 06:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





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

0C的10进制是 12。
但是,在一个文件中,回车符与换行符我们是看不到的,可是它照样要占用空间。

回车符16进制是 0D ,它的10进制是13(常常编程里用到的那个熟悉的数字)
换行符16进制是 0A ,它的10进制是10。

所以,当你在文本文件中所输入一串字符以后仅仅打了一个回车,那么这可就占了两个字节的宽度,只是一般没有注意到而已(因为看不见)



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

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-12-21 06:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





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


(假如我建立一个新文件,取名为 A.TXT )

C:\TEMP\debug>copy con a.txt



^Z
        1 file(s) copied.

(我建立的上面的文件内容,我只按3次回车键)
(那个^Z是我按的 Ctrl+Z 保存文件的一个快捷键)


(下面用 Debug 工具调出 a.txt 文件来,看看到底怎么回事)

C:\TEMP\debug>debug a.txt
-rcx
CX 0006  (这个6代表文件长度是6个字节)
:
-d
0AF5:0100  0D 0A 0D 0A 0D 0A 31 31-31 31 31 31 0D 0A 31 31
0AF5:0110  31 31 31 31 31 31 31 31-31 31 0D 0A 34 00 E4 0A
0AF5:0120  F6 06 15 99 20 75 0A 80-3E D2 99 00 75 BB 49 74
0AF5:0130  B8 BA 0D 8C EB 23 33 D2-87 D1 B8 01 42 CD 21 A3
0AF5:0140  DF 99 89 16 E1 99 80 3E-C5 96 00 74 9C B4 40 CD
0AF5:0150  21 72 5F C6 06 E3 99 1A-C3 E8 FF 0F FE 06 D2 96
0AF5:0160  80 3E D1 96 00 74 48 8B-1E 13 99 83 FB 00 7E 33
0AF5:0170  8B 0E E1 99 8B 16 DF 99-8B C1 0B C2 74 21 B8 00
-q


(现在 Dir 看一下这个文件的大小)

C:\TEMP\debug>dir a.txt
Volume in drive C is DISK-C
Volume Serial Number is 4089-CA39

Directory of C:\TEMP\debug

2006-12-20  17:51                 6 a.txt
               1 File(s)              6 bytes
               0 Dir(s)   1,301,233,664 bytes free


(看到了,是6个字节)
刚才在 Debug 工具中所看到的这个我只按了3次回车键的这个文本文件里16进制所显示的内容为:

0D 0A 0D 0A 0D 0A

0D是回车符
0A是换行符
一共6个,每个符号占用了一个字节。
(上面的16进制是为显示和阅读方便)


(所以表面上看到一个文件中最后的几个字节,当我数着一共有多少个字节我要删掉时,其实还应该计算那些看不到的回车换行符)

[ Last edited by redtek on 2006-12-20 at 07:37 PM ]



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

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-12-21 06:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yy2372575
初级用户





积分 73
发帖 26
注册 2006-5-3
状态 离线
『第 11 楼』:  

我对你的敬仰如滔滔江水连绵不绝。。。。。。多谢指点!!感谢。

2006-12-21 08:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




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


  在DOS下面应该没有fsutil这个命令,所以无法执行。


2006-12-21 12:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: