Windows命令行使用偏移量连接文件

Windows命令行使用偏移量连接文件,windows,file,batch-file,offset,Windows,File,Batch File,Offset,我正在尝试使用Windows批处理文件将多个文件连接在一起,以生成文件的单个图像。现在,我发现这可以使用copy“copy file1+file2+file3+file4 FileConcat”来完成,但我想做的是启动file1@byte address 00,然后启动file2@byte address 999424,启动file3@byte address 3997696和file4@byte address 4001536。我可以在Linux中使用以下方法实现这一点,但是有没有一种方法可以

我正在尝试使用Windows批处理文件将多个文件连接在一起,以生成文件的单个图像。现在,我发现这可以使用copy“copy file1+file2+file3+file4 FileConcat”来完成,但我想做的是启动file1@byte address 00,然后启动file2@byte address 999424,启动file3@byte address 3997696和file4@byte address 4001536。我可以在Linux中使用以下方法实现这一点,但是有没有一种方法可以在windows中实现这一点而不必编写特定的应用程序?任何帮助,非常感谢

set COMBINEDFILE=IMAGE/combined.srec

dd conv=notrunc bs=1 if=INPUT/FILE1.srec of=$COMBINEDFILE seek=0

dd conv=notrunc bs=1 if=INPUT/FILE2.xap of=$COMBINEDFILE seek=999424

dd conv=notrunc bs=1 if=INPUT/FILE3.html of=$COMBINEDFILE seek=3997696

dd conv=notrunc bs=1 if=INPUT/FILE4.js of=$COMBINEDFILE seek=4001536

感谢您的帮助

我只知道在标准批处理中附加文件的方法,没有截断文件的方法

如果不需要截断输入文件,可以添加它们并填充它们以填充空白

为此,您需要1字节大小的填充文件(
1.pad
),以及10、100、1000、10000和100000字节大小的填充文件,以提高性能

PADFILE.BAT
-填充文件的实用程序批处理:

@ECHO OFF
IF %2.==. GOTO :Syntax
IF NOT %3.==. GOTO :Syntax
SET /A _size=1*%2
:CheckSize
SET /A _Left=%_Size%-%~z1
IF %_Left% LSS 0 1>&2 ECHO File already bigger than size!&TYPE 2>NUL&GOTO :EOF
IF %_Left% == 0 GOTO :EOF
IF %_Left% GEQ 100000 TYPE 100000.PAD>>%1&&GOTO:CheckSize
IF %_Left% GEQ 10000 TYPE 10000.PAD>>%1&&GOTO:CheckSize
IF %_Left% GEQ 1000 TYPE 1000.PAD>>%1&&GOTO:CheckSize
IF %_Left% GEQ 100 TYPE 100.PAD>>%1&&GOTO:CheckSize
IF %_Left% GEQ 10 TYPE 10.PAD>>%1&&GOTO:CheckSize
TYPE 1.PAD>>%1
GOTO :CheckSize
:Syntax
ECHO Pads file until desired size.
ECHO Syntax: PADFILE filepath size
现在,您的命令如下所示:

SET COMBINEDFILE=IMAGE/combined.srec
COPY INPUT/FILE1.srec %COMBINEDFILE%
PADFILE.BAT %COMBINEDFILE% 999424
COPY %COMBINEDFILE%+INPUT/FILE2.xap
PADFILE.BAT %COMBINEDFILE% 3997696
COPY %COMBINEDFILE%+INPUT/FILE3.html
PADFILE.BAT %COMBINEDFILE% 4001536
COPY %COMBINEDFILE%+INPUT/FILE4.js
请记住,至少应将
1.PAD
放在与
PADFILE.BAT
相同的文件夹中

要从
1.PAD
快速创建其他
.PAD
文件,您可以使用:

(FOR /L %I IN (1,1,10) DO @TYPE 1.PAD)>10.PAD
(FOR /L %I IN (1,1,10) DO @TYPE 10.PAD)>100.PAD
(FOR /L %I IN (1,1,10) DO @TYPE 100.PAD)>1000.PAD
(FOR /L %I IN (1,1,10) DO @TYPE 1000.PAD)>10000.PAD
(FOR /L %I IN (1,1,10) DO @TYPE 10000.PAD)>100000.PAD

我有一个替代的答案来回答LS_dev的答案,但它是基于他的答案,所以我不能为它赢得任何荣誉。我没有在循环中使用多个填充文件生成填充,而是基于所需的填充生成一个空文件,并将其附加到文件中。我不是全职程序员,所以这样做可能会有“问题”。如果您使用的是win7计算机,则需要管理员权限才能运行此脚本。fsutil需要管理员权限才能运行。再次感谢你,德夫

挂表

@ECHO OFF
IF %2.==. GOTO :Syntax
IF NOT %3.==. GOTO :Syntax
SET /A _size=1*%2
del padding.txt
SET /A _Left=%_Size%-%~z1

fsutil file createnew %cd%\padding.txt %_Left%&&goto:eof

:Syntax
ECHO generates padding file to make file specific size
ECHO Syntax: PADOUT filepath size
生成.BAT

del IMAGE\combined.srec
SET COMBINEDFILE= IMAGE\combined.srec
COPY INPUT\lwip_140_echo_server.elf.srec %COMBINEDFILE%
CALL PADOUT.BAT %COMBINEDFILE% 999424-1
COPY %COMBINEDFILE%+padding.txt+INPUT\MPDU1_Read.xap /b %COMBINEDFILE%
CALL PADOUT.BAT %COMBINEDFILE% 3997696-1
COPY %COMBINEDFILE%+padding.txt+INPUT\MPDU1_ReadTestPage.html %COMBINEDFILE%
CALL PADOUT.BAT %COMBINEDFILE% 4001536-1
COPY %COMBINEDFILE%+padding.txt+INPUT\Silverlight.js %COMBINEDFILE%

在LS_DE提供的批处理文件脚本的开头添加以下代码时。然后您不需要创建任何东西,只需要创建此批处理文件。如果文件已经创建

这段代码创建了长度为的“空”PAD文件。 我已经验证了这是没有任何问题的工作

fsutil file createnew %~dp01.PAD 1
fsutil file createnew %~dp010.PAD 10
fsutil file createnew %~dp0100.PAD 100
fsutil file createnew %~dp01000.PAD 1000
fsutil file createnew %~dp010000.PAD 10000
fsutil file createnew %~dp0100000.PAD 100000

文件是否大于或小于指定的大小?如果较小,则可以一直填充目标文件,直到达到偏移量。您好,是的,文件将始终小于分配给它们的指定大小。这个填充的主意听起来不错,但我该怎么做呢??非常感谢您的回复。如果您计算偏移量,您会注意“行尾”字符吗?您好,Endro,我在Linux中不计算偏移量,每个文件的偏移量是固定的。文件1在00处启动,文件2在字节999424处启动。文件1的结尾和文件2的开头之间总是有空格,空格中的内容并不重要。重要的是每个文件的起始字节位置。我希望这是有道理的。好吧,我有我的想法!!!我可以用以下步骤来做吗??步骤1-将File1.srec复制到combined.srec步骤2-使用filesize.bat(@echo off;echo%~z1)获取combined.srec文件的大小步骤3-从下一个文件起点(999424-filesize)减去该文件大小,并使用fsutil生成一个文件(temp.txt)以获得差异。步骤4-将temp.txt压缩到combined.srec步骤5-将Concat文件2压缩到combined.srec步骤6的末尾-重复步骤2到5,在步骤5中更改下一个开始位置和文件。这听起来可行吗?但是我不知道怎么做!尊敬的LS_dev,非常感谢您提供这一令人印象深刻的解决方案。但是,出于某种原因,它在file4.js的末尾添加了少量的填充,而不是在文件之间添加。我不知道为什么从你写的代码,所以我很困惑。另外,我忘了提到file2.xap是一个二进制文件,在这段代码中,它不复制整个文件,只复制前100个字节左右。尝试使用/B选项更改此行的副本,但也无法解决此问题。再次感谢您提交此解决方案,我从来没有想到过这样的事情。除非您达到某个文件大小限制(2147483647=~2GB),否则这是没有意义的。您是否将名为
1.PAD
的1字节大小的文件与批处理放在同一文件夹中?是的,请严格按照说明操作。我生成了所有带有空格(0x20)的.PAD文件,但随后生成了“0”的.PAD文件,以便查看它们的放置位置。就在那时,我看到他们被放在文件4的末尾。太近了!!嗨,经过一点调试,现在可以工作了!!需要在PADFILE.BAT之前添加调用,并在复制行的文件地址中将“/”更改为“\”。它的工作原理令人惊讶,非常聪明,所以感谢LS_dev花时间研究这个问题。是的,我应该在一开始就说我想要一个批处理文件。不过现在都在工作。你怎么知道这些?有一本关于DOS的书,里面有所有的开关吗?我一直想知道文件的大小,但是你的代码中有%z1。你能给我指一些有用的链接吗?再次感谢你的帮助。嗯。。。我不知道这个实用程序,是的,它需要管理员权限。但你甚至不需要一批!检查如下内容:
fsutil file setvaliddata%COMBINEDFILE%999424
然后
COPY%COMBINEDFILE%+INPUT\MPDU1_Read.xap
等等……您好,我已经尝试过了,并不断收到“参数不正确”的消息。我在根目录c:上的test.txt文件中尝试过它,但仍然不起作用。如果我能让它工作,那就太好了。好样的!!CheersHi,阅读这里的讨论ss64.org/viewtopic.php?id=327似乎fsutil虽然有用,但根据MS版本的操作系统,它可能会产生不可预测的结果。也许,fsutil的这个功能(我想使用的功能)在win7上不起作用。。谢谢微软!!