返回列表 发帖

[文本处理] 如何用批处理将文件修改到指定大小?

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

for %%a in (a.txt) do set /a b=64*1024-%%~za
fsutil file createnew tmp %b%
copy /b a.txt+b.txt a.txt
del tmpCOPY

TOP

不好意思!我用你的代码试了一下,可是不行啊。是我哪里搞错了吗?

TOP

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

TOP

@echo off&setlocal enabledelayedexpansion
cmd /u/c echo;>2.$
findstr/vrc:$ 2.$>1.$
set n=1
for /l %%a in (1 1 16) do (
set /a "n+=(m=n)"
set list=!n! !list!
copy>nul /b !m!.$+!m!.$ !n!.$
)
for %%a in (test.txt) do (
set /a z=0x10000-%%~za
for %%b in (!list!1) do (
if !z! gtr %%b (
set /a "z-=%%b"
copy /b test.txt+%%b.$ test.txt
)
)
)
copy /b test.txt+1.$ test.txt
del /f /q *.$
pauseCOPY

TOP

16禁止的00不就是ascii的null字符码……

TOP

6# applba

我百度了半天,仍然不懂用debug...

TOP

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

debug的方案
@goto :start
r bx
1
r cx
0
w
q
:start
@echo off
chcp 437 & graftabl 936 & cls
pushd %~sdp1
ren %~snx1 %~sn1.tmp
debug %~sn1.tmp < %0 >nul
ren %~sn1.tmp "%~nx1"
popdCOPY
天的白色影子

TOP

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则不行

TOP

从没有深究过copy /b a.txt+b.txt b.txt
现在想来可能是语义上存在二义性的问题
当第一步copy将a.txt拷贝入b.txt中后
再读b.txt是读拷贝之前的版本还是拷贝之后的版本呢?
这在命令实现上是有困难的
天的白色影子

TOP

10# qzwqzw


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

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

TOP

DEBUG  比较靠谱。批处理,或者是记事本,好像还不能处理16进制!个人理解是这样~
享受批处理的神奇!!!

TOP

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
天的白色影子

TOP

复杂,我晕了的

TOP

返回列表