我正在使用一个简单的批处理脚本合并两个 ASCII 文件,类似这样:
COPY a.txt+b.txt c.txt /y /a
问题是,C语言中最后一个字符会被设置为1A
,这是SUB
的十六进制表示。 c.txt文件被输入到另一个可执行文件中,但该文件不喜欢末尾的1A
。生成c.txt文件后,如果我在Notepad++中打开并删除最后一个字符,则文件可以正常工作。
如何合并
a.txt
和b.txt
而不会将1A
附加到c.txt
的末尾?我正在使用一个简单的批处理脚本合并两个 ASCII 文件,类似这样:
COPY a.txt+b.txt c.txt /y /a
问题是,C语言中最后一个字符会被设置为1A
,这是SUB
的十六进制表示。 c.txt文件被输入到另一个可执行文件中,但该文件不喜欢末尾的1A
。a.txt
和b.txt
而不会将1A
附加到c.txt
的末尾?/a
和 /b
开关的放置非常重要。它们的表现取决于它们是在源文件名后还是目标文件名后放置。
当与目标文件名一起使用时,/a
会导致添加文件结束标记(ASCII 26)。实际上,您正在指定这个标记!
/a
指定文件为 ASCII 格式,并且被复制到第一个 ASCII 26 文件结束标记之前但不包括该标记。该字符及其后面的任何内容都将被忽略。
/b
会将整个文件复制,包括任何文件结束标记和标记后面的内容。
/a
会在最后添加 ASCII 26 作为最后一个字符。
/b
不会在最后添加 ASCII 26。
...虽然我没有测试过,但您应该使用
COPY a.txt+b.txt /a c.txt /b /y
COPY a.txt+b.txt c.txt /y /b
COPY a.txt+b.txt /b c.txt /y
COPY /b a.txt+b.txt c.txt /y
但仅在DOS文件结尾未用于表示文件结尾的情况下,以下内容才有效:
COPY a.txt /b + b.txt c.txt /y
COPY /b a.txt + b.txt c.txt /y
https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/copy
您可以将设备名称替换为源或目标的一个或多个出现。
将copy
更改为type
type a.txt>c.txt
type b.txt>>c.txt
n
个命令来合并 n
个文件,不像适当的 copy
命令。 - AakashM您可以将开关/a
(ASCII文本)更改为/b
(二进制)
还可以查看copy /?
因此,生成的命令是
COPY a.txt+b.txt c.txt /y /b
我原本认为@Andrew的示例是错误的,但实际上比我的更正确。
问题在于,[/A | /B]
指定符可以双向工作。
这有点令人困惑。 copy /?
在第一个源文件之前显示 [/A | /B],但在每个其他源文件之后以及目标文件之后也会显示
COPY ... [/A | /B ] source [/A | /B] [+ source [/A | /B] ...] [destination [/A | /B]]
该指定符实际上适用于之前的文件,但然后也适用于其后的所有文件,包括目标文件。 但是,只有在命令行中找到相反的指定符时,后面的指定符才适用于所有文件,但也适用于前面的文件。
组合复制命令默认为ASCII
示例。
copy aa + bb + cc dd
ASCII ASCII ASCII ASCII
将所有要复制的文件指定为二进制,下面三个示例具有相同的效果:
copy /b aa + bb + cc dd
bin bin bin bin
copy aa /b + bb + cc dd
bin bin bin bin
copy aa + /b bb + cc dd
bin bin bin bin
还有一些测试:
copy aa + bb /a + cc dd
ASCII ASCII ASCII ASCII
copy aa + bb /b + cc dd
ASCII BIN BIN BIN
copy /b aa + bb + cc dd /a
bin bin bin ascii
copy aa /a + bb + cc dd /b
ASCII ASCII ASCII bin
copy aa + bb + cc dd /b
ASCII ASCII ASCII bin
copy aa + bb + cc /a dd /b
ASCII ASCII ASCII bin
copy aa + bb + cc aa /b
BIN ASCII ASCII BIN
copy aa + bb + cc /b aa
BIN ASCII BIN BIN
@echo off
set concatenated=final.js
pushd %~dp0
set error=
copy nul "%concatenated%"
if errorlevel 1 set error=true
for /f %%a in (filelist.txt) do (
echo. && echo.
echo. *** %%a
copy /B /V "%concatenated%" + "%%a" "%concatenated%"
if errorlevel 1 set error=true
)
popd
echo.
if defined error (echo. !!!!!!!!! THERE WERE ERRORS !!!!!!!!!!
) else echo. *** ALL DONE ***
echo.
pause
exit /b
/a
应用于其前面的文件名和命令中剩余的所有文件名,直到copy
遇到另一个/a
或/b
开关。" 因此它应该在文件名之后。我想在不同的Windows shell中可能会有所改变。 - Andrew Leach
/a
开关的位置很重要。谢谢。 - AyushCOPY /b a.txt+b.txt c.txt /y
使其工作。感谢您指明正确的方向。 - Ayush