[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 利用Fsutil作文本处理

以前用Fsutil 也就是用来列出盘符,生成指定大小文件,等等……

而昨日,在batman发的练习中要求文本处理,把一行字符串大概每60个字节分一次行。
当时恶搞了一下,用mode con cols=61 lines=25 限制输出。

当时联想到了用fsutil 可以实现字节操作,探索了一天,感觉还可以。

已知特性
1。"%!a!%"这样的字符,可以通过。
2。可按字节做切割操作。缺点也在此,当中文与单字节字符混合时,切割很可能会把中文的“码”分割
        所以一般适合于 纯单字节或者纯双字节的文本操作。
        要实现通用可能又需要不少判断。
3。感觉效率不是好。
也因此,我决定对于那个练习的解答,另外发帖,是为了突出fsutil的字节操作特性,以及希望另外讨论。



下面我用批处理打包的代码,自主建立适当环境,代码仅为测试阶段,诸多缺点,欢迎批评指出。

  1. @set file="cuter.bat" "text.txt"
  2. @echo off
  3. ::code by 523066680@cn-dos.net
  4. if not exist Testx md Testx
  5. for %%a in (%file%) do (call :setup %%~a)
  6. exit
  7. :setup
  8. set "act="
  9. for /f "delims= eol=#" %%a in (%~nx0) do (
  10.   if "%%a"=="::%* end" (goto :eof)
  11.   if defined act echo,%%a>>"Testx\%*"
  12.   if "%%a"=="::%*" errcommand>"Testx\%*" 2>nul&set act=act
  13. )
  14. ::cuter.bat
  15. @echo off
  16. err>result.x 2>nul
  17. for /f "delims= eol=#" %%a in (text.txt) do (
  18. for %%b in (0 1 2 3 4) do (
  19.    set /a seta=%%b*61,setb=seta+61
  20.    echo,    %%a>temp.x
  21.    call :func %%seta%% %%setb%%
  22. )
  23. )
  24. start result.x
  25. pause
  26. exit
  27. :func
  28.    fsutil file setzerodata offset=0 length=%1 temp.x     >nul
  29.    fsutil file setzerodata offset=%2 length=10000 temp.x >nul
  30.    for /f "delims= eol=#" %%c in ('more temp.x') do (echo,%%c>>result.x)
  31. goto :eof
  32. ::cuter.bat end
  33. ::text.txt
  34. "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!"
  35. -Greg A. Marino, Senior Systems Engineer/Consultant, Westtown Consulting Group, Inc.
  36. 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!%
  37. ::text.txt end
复制代码



生成的测试文件夹为Testx

我认为以上不是fsutil 字符操作的一个好例子. 重点在函数部分。
如果大家有什么好想法,不要吝啬啊~(你看,我知道的全搬出来了)

楼上的测试代码为:
  1. @echo off
  2. err>result.x 2>nul
  3. for /f "delims= eol=#" %%a in (text.txt) do (
  4. for %%b in (0 1 2 3 4) do (
  5.    set /a seta=%%b*61,setb=seta+61
  6.    echo,    %%a>temp.x
  7.    call :func %%seta%% %%setb%%
  8. )
  9. )
  10. start result.x
  11. pause
  12. exit
  13. :func
  14.    fsutil file setzerodata offset=0 length=%1 temp.x     >nul
  15.    fsutil file setzerodata offset=%2 length=10000 temp.x >nul
  16.    for /f "delims= eol=#" %%c in ('more temp.x') do (echo,%%c>>result.x)
  17. goto :eof
复制代码

[ 本帖最后由 523066680 于 2009-8-12 13:26 编辑 ]

TOP

呵呵。还真巧。

才写了个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 编辑 ]
1

评分人数

TOP

我也赞成用其他方式做好点的字符类操作。

TOP

返回列表