Board logo

标题: [文本处理] 如何用批处理将文件修改到指定大小? [打印本页]

作者: pjzhong    时间: 2011-6-16 14:50     标题: 如何用批处理将文件修改到指定大小?

有一批单个文件小于指定大小(如:64K)的文件,如何用批处理的方式将文件补零(在16进制下的00)到整64K大小?请各位大侠指教!
作者: CrLf    时间: 2011-6-16 16:12

  1. for %%a in (a.txt) do set /a b=64*1024-%%~za
  2. fsutil file createnew tmp %b%
  3. copy /b a.txt+b.txt a.txt
  4. del tmp
复制代码

作者: pjzhong    时间: 2011-6-17 08:59

不好意思!我用你的代码试了一下,可是不行啊。是我哪里搞错了吗?
作者: pjzhong    时间: 2011-6-17 09:01

我是这样试的:新建一个a.txt,随便往里写点内容,然后运行你的批处理,可是a.txt没有任何变化。
另外,我的文件不一定是txt文件。请高手们鼎力相助,谢谢。
作者: CrLf    时间: 2011-6-17 13:38

  1. @echo off&setlocal enabledelayedexpansion
  2. cmd /u/c echo;>2.$
  3. findstr/vrc:$ 2.$>1.$
  4. set n=1
  5. for /l %%a in (1 1 16) do (
  6. set /a "n+=(m=n)"
  7. set list=!n! !list!
  8. copy>nul /b !m!.$+!m!.$ !n!.$
  9. )
  10. for %%a in (test.txt) do (
  11. set /a z=0x10000-%%~za
  12. for %%b in (!list!1) do (
  13. if !z! gtr %%b (
  14. set /a "z-=%%b"
  15. copy /b test.txt+%%b.$ test.txt
  16. )
  17. )
  18. )
  19. copy /b test.txt+1.$ test.txt
  20. del /f /q *.$
  21. pause
复制代码

作者: applba    时间: 2011-6-17 13:54

16禁止的00不就是ascii的null字符码……
作者: CrLf    时间: 2011-6-17 14:05

6# applba

我百度了半天,仍然不懂用debug...
作者: qzwqzw    时间: 2011-6-17 18:01

二楼的代码问题在这
copy /b a.txt+b.txt a.txt
改成下面这样就应该没问题了
copy /b a.txt+tmp a.txt

debug的方案
  1. @goto :start
  2. r bx
  3. 1
  4. r cx
  5. 0
  6. w
  7. q
  8. :start
  9. @echo off
  10. chcp 437 & graftabl 936 & cls
  11. pushd %~sdp1
  12. ren %~snx1 %~sn1.tmp
  13. debug %~sn1.tmp < %0 >nul
  14. ren %~sn1.tmp "%~nx1"
  15. popd
复制代码

作者: CrLf    时间: 2011-6-17 18:10

8# qzwqzw


也许是系统环境不同吧,在我这里copy /b a.txt+b.txt a.txt是先用a.txt覆盖a.txt再用b.txt附加到a.txt后,所以copy /b a.txt+b.txt a.txt没有问题,copy /b a.txt+b.txt b.txt则不行
作者: qzwqzw    时间: 2011-6-18 09:35

从没有深究过copy /b a.txt+b.txt b.txt
现在想来可能是语义上存在二义性的问题
当第一步copy将a.txt拷贝入b.txt中后
再读b.txt是读拷贝之前的版本还是拷贝之后的版本呢?
这在命令实现上是有困难的
作者: CrLf    时间: 2011-6-18 13:25

10# qzwqzw


copy /b a+b a不等于copy /b a+b b,前者可以成功合并,后者只等于copy a b

这里的copy输出到文件的方式和sort的/o开关类似,应该是执行一步输出一步的,不会像句柄重定向那样在预处理时就清空了目标文件
而且从现象来猜测,copy文件时是修改了硬盘数据与文件的关联呢?还是把当前处理的文件整个复制到内存(大文件怎么办)?或者是能够自主判断输入输出设备是否相等?
作者: cxmzlxb    时间: 2011-6-18 15:20

DEBUG  比较靠谱。批处理,或者是记事本,好像还不能处理16进制!个人理解是这样~
作者: qzwqzw    时间: 2011-6-18 17:25

copy 是读取源文件内容到内存然后再写入目标的
不会存在修改文件与硬盘数据关联的情况

copy a+b+c的形式缺省是以a为目标的
与copy a+b+c a 实质等同
其机制大致如下:
读方式打开a
读a到内存
发现目标是a
关闭a
读写方式打开a
读a到内存
读方式打开b
读b到内存
写内存到a
关闭b
读方式打开c
读c到内存
写内存到a
关闭c
关闭a

copy a+b+c c 的机制大致如下:
读方式打开a
读a到内存
发现目标是c
读写方式打开c
写内存到c
关闭a
读方式打开b
读b到内存
写内存到c
关闭b
关闭c
作者: CrLf    时间: 2011-6-18 17:28

复杂,我晕了的




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2