Mofi のコメントにあるように、test1.txt の最後の行が改行で終わっていません。COPY も TYPE もファイルの末尾に改行を追加しないため、test1 の末尾が test2 の先頭に達します。
あなたのコメントでは、次を使用して問題を解決したと述べています。
for %%x in (test*.txt) do more "%%x" >>new.txt
以下を使用すると、もう少し効率的にすることができます。
(for %%x in (test*.txt) do more "%%x") >new.txt
どちらの方法でも、コンテンツにタブ文字が含まれておらず、ソース ファイルが 32k 行を超えない限り、上記は正常に機能します。
タブ文字は、MORE によって一連の空白文字に変換されます。
また、出力がリダイレクトされた MORE は、32k 行に達すると一時停止し、入力を待ちます。
上記のいずれかが問題である場合は、次のようなことができます。
(
for %%x in (test*.txt) do (
type "%%x"
echo(
)
) >new.txt
これにより、各ファイル間に常に改行が挿入されます。ただし、ファイルの最後の行に既に改行が含まれている場合、これは問題になる可能性があります。そのような場合、あなたはで終わるでしょう
1
2
3
4
5
6
7
完全な解決策は、ファイルの最後の行が改行で終わっていないことを検出することです。
以下は、すべてのファイルが Windows スタイルの改行 (キャリッジ リターン/ライン フィード) を使用していることがわかっている場合に機能します。FINDSTR は、キャリッジ リターンを含まない行を識別します。
(
for %%x in (test*.txt) do (
type "%%x"
findstr /v $ "%%x" >nul && echo(
)
) >new.txt
一部のファイルが代わりに 'nix スタイル (改行のみ) を使用している場合、解決策はもう少し複雑になります。この FINDSTR は、改行を含まない行を識別します。
setlocal enableDelayedExpansion
:: define LF to contain a line feed character (0x0A)
set ^"LF=
^" The empty line above is critical - DO NOT REMOVE
(
for %%x in (test*.txt) do (
type "%%x"
findstr /v "!lf!." >nul && echo(
)
) >new.txt