![Board logo](images/default/logo.gif)
标题: [文本处理] 利用Fsutil作文本处理 [打印本页]
作者: 523066680 时间: 2009-8-12 13:13 标题: 利用Fsutil作文本处理
以前用Fsutil 也就是用来列出盘符,生成指定大小文件,等等……
而昨日,在batman发的练习中要求文本处理,把一行字符串大概每60个字节分一次行。
当时恶搞了一下,用mode con cols=61 lines=25 限制输出。
当时联想到了用fsutil 可以实现字节操作,探索了一天,感觉还可以。
已知特性
1。"%!a!%"这样的字符,可以通过。
2。可按字节做切割操作。缺点也在此,当中文与单字节字符混合时,切割很可能会把中文的“码”分割
所以一般适合于 纯单字节或者纯双字节的文本操作。
要实现通用可能又需要不少判断。
3。感觉效率不是好。
也因此,我决定对于那个练习的解答,另外发帖,是为了突出fsutil的字节操作特性,以及希望另外讨论。
下面我用批处理打包的代码,自主建立适当环境,代码仅为测试阶段,诸多缺点,欢迎批评指出。
- @set file="cuter.bat" "text.txt"
- @echo off
- ::code by 523066680@cn-dos.net
- if not exist Testx md Testx
- for %%a in (%file%) do (call :setup %%~a)
- exit
- :setup
- set "act="
- for /f "delims= eol=#" %%a in (%~nx0) do (
- if "%%a"=="::%* end" (goto :eof)
- if defined act echo,%%a>>"Testx\%*"
- if "%%a"=="::%*" errcommand>"Testx\%*" 2>nul&set act=act
- )
- ::cuter.bat
- @echo off
- err>result.x 2>nul
- for /f "delims= eol=#" %%a in (text.txt) do (
- for %%b in (0 1 2 3 4) do (
- set /a seta=%%b*61,setb=seta+61
- echo, %%a>temp.x
- call :func %%seta%% %%setb%%
- )
- )
- start result.x
- pause
- exit
- :func
- fsutil file setzerodata offset=0 length=%1 temp.x >nul
- fsutil file setzerodata offset=%2 length=10000 temp.x >nul
- for /f "delims= eol=#" %%c in ('more temp.x') do (echo,%%c>>result.x)
- goto :eof
- ::cuter.bat end
- ::text.txt
- "Finally, a step-by-step VBScripting book to make you look like a programmer without the time and sweat! Don't waste your time searching the Internet for examples-this book does it for you!"
- -Greg A. Marino, Senior Systems Engineer/Consultant, Westtown Consulting Group, Inc.
- Visual Basic Scripting (VBScript) and Windows Management Instrumentation (WMI) are vital tools for systems administrators grappling with the increasing complexity of Windows technologies. However, busy admins have been without a straightforward guide to scripting...until now.%!test!%
- ::text.txt end
复制代码
生成的测试文件夹为Testx
作者: 523066680 时间: 2009-8-12 13:24
我认为以上不是fsutil 字符操作的一个好例子. 重点在函数部分。
如果大家有什么好想法,不要吝啬啊~(你看,我知道的全搬出来了)
楼上的测试代码为:- @echo off
- err>result.x 2>nul
- for /f "delims= eol=#" %%a in (text.txt) do (
- for %%b in (0 1 2 3 4) do (
- set /a seta=%%b*61,setb=seta+61
- echo, %%a>temp.x
- call :func %%seta%% %%setb%%
- )
- )
- start result.x
- pause
- exit
- :func
- fsutil file setzerodata offset=0 length=%1 temp.x >nul
- fsutil file setzerodata offset=%2 length=10000 temp.x >nul
- for /f "delims= eol=#" %%c in ('more temp.x') do (echo,%%c>>result.x)
- goto :eof
复制代码
[ 本帖最后由 523066680 于 2009-8-12 13:26 编辑 ]
作者: slore 时间: 2009-8-12 15:57
呵呵。还真巧。
才写了个VBS对文件进行字节操作的代码……正好找到了发的时机了。
'********************************************************************
'
'函数: SaveSubFile 作者:Slore 时间:2009-08-11
'功能:
' 1. 将文件strInFile从LngRead开始读取LngLen字节,
' 保存为strOutFile;
' 2. 把文件strInFile从LngRead开始读取LngLen字节,
' 替换文件strOutFile从LngWrite开始的LngLen个字节。
'
' 成功返回True,失败返回False。
'
'参数:
' 1. strInFile : 要读取的文件路径
' 2. strOutFile: 要存储的文件路径
' 3. LngRead : 输入文件数据读取的起始位置
' 4. LngWrite : 输出文件数据存储的起始位置
' 如果此参数小于0,则如功能1 所描述;
' 反之,则如功能2 所描述。
' 5. LngLen : 读取和存储字节长度
'
'实例:
'Call SaveSubFile("FileA.Bin","FileB.Bin",3,-1,3) '功能1
'Call SaveSubFile("FileA.Bin","FileB.Bin",3,3,3) '功能2
'********************************************************************
Const adTypeBinary = 1
Const adTypeText = 2
Const adModeUnknown = 0
Const adModeRead = 1
Const adModeWrite = 2
Const adModeReadWrite = 3
Const adModeShareDenyRead = 4
Const adModeShareDenyWrite = 8
Const adModeShareExclusive = 12
Const adModeShareDenyNone = 16
Const adModeRecursive = &H400000
Const adSaveCreateNotExist = 1
Const adSaveCreateOverwrite = 2
Function SaveSubFile(strInFile,strOutFile,LngRead,LngWrite,LngLen)
Dim objStreamR,objStreamW
If strInFile = "" or strOutFile = "" Then
MsgBox "源文件和目标文件不能为空",vbInformation,"错误"
SaveSubFile = False
Exit Function
End If
Set objStreamR = CreateObject("Adodb.Stream")
objStreamR.Type = adTypeBinary
objStreamR.Mode = adModeReadWrite
objStreamR.Open
objStreamR.LoadFromFile strInFile
If LngRead + LngLen + 1 > objStreamR.Size Then
MsgBox "源文件长度与读取数据长度不匹配。",vbInformation,"错误"
SaveSubFile = False
Exit Function
End If
Set objStreamW = CreateObject("Adodb.Stream")
objStreamW.Type = adTypeBinary
objStreamW.Mode = adModeReadWrite
objStreamW.Open
If LngWrite > 0 Then
objStreamW.LoadFromFile strOutFile
objStreamW.Position = LngWrite
End If
objStreamR.Position = LngRead
objStreamW.Write objStreamR.Read(LngLen)
objStreamW.SaveToFile strOutFile, adSaveCreateOverwrite
objStreamR.Close
objStreamW.Close
SaveSubFile = True
End Function
[ 本帖最后由 slore 于 2009-8-12 15:59 编辑 ]
作者: 523066680 时间: 2009-8-12 16:33
我也赞成用其他方式做好点的字符类操作。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |