Windowsコマンドプロンプトでテキストファイルを結合する方法|copy /bと注意点

Windowsのコマンドプロンプトで複数のテキストファイルを結合するなら、入力ファイルを順番に指定した copy /b が基本です。元のバイト列をそのままつなげるため、文字コードの変換や改行の補完は行いません。入力と出力を別フォルダーに分け、既存の結果を上書きしないことから始めましょう。

この記事のコマンドは cmd.exe(コマンドプロンプト)用です。Windows Terminalを使う場合も「コマンド プロンプト」のタブで実行してください。PowerShellでは同じ名前のコマンドでも意味が異なることがあります。

目次

最初に確認:そのまま結合できるテキストとは

  • 入力は同じ文字コードにそろえます。初めて試すなら、UTF-8・BOMなしで保存した短いテキストを使うと確認しやすくなります。
  • 行単位のログなどをつなぐ場合は、最後のファイル以外の末尾に必要な改行があるか確認します。
  • 結合順序を決めます。ファイル名を 01.txt、02.txt のようにそろえたうえで、コマンドにも順番どおりに書きます。
  • 入力のバックアップを取り、出力先には未使用の名前を指定します。結合中に入力ファイルを別のアプリで更新しないでください。

CSVのヘッダーを1回だけ残す、JSONを配列にまとめる、文字コードを統一する、といった処理は単純な連結とは別です。また、画像・PDF・実行ファイルのバイト列をつなげても、有効な1つの画像・文書・プログラムになるわけではありません。

準備:入力と出力を別フォルダーにする

例では、書き込み可能な作業フォルダー C:\Work\TextJoin の中に input と output を作ります。結合する 01.txt と 02.txt は input に置き、output は空にしておきます。パスは自分の保存場所に置き換えてください。

スタートメニューで「コマンド プロンプト」を検索して起動し、作業フォルダーへ移動します。/d はドライブも一緒に切り替える指定です。パスは、空白の有無にかかわらず引用符で囲んでおくと読み間違いを防げます。

cd /d "C:\Work\TextJoin"

移動に失敗したら、そのまま次のコマンドを実行せずにパスを直します。次の表示で、入力ファイルの存在とサイズを確認してください。この例では、中身のある通常のテキストファイルを使います。

dir /a:-d "input\01.txt" "input\02.txt"

出力先にも同名のファイルやフォルダーがないか確認します。STOP と表示された場合は、既存の結果を削除するのではなく、内容を確認して別の出力名を選んでください。

if exist "output\combined.txt" echo STOP: output already exists.

この確認は、他のプログラムが同時にファイルを作成することまで防ぐものではありません。作業用のフォルダーを使い、並行して同じ出力先へ書き込まないようにします。

基本:copy /bで順番を指定して結合する

準備できたら、次のコマンドを実行します。output フォルダーが存在し、combined.txt がまだない状態を前提にしています。

copy /b /-y "input\01.txt"+"input\02.txt" "output\combined.txt" /b

01.txt の後に 02.txt の内容が続きます。入力とは別の出力先を指定しているため、入力ファイルを書き換える操作ではありません。/-y は既存ファイルの上書き確認を有効にする指定です。想定外の確認が出たら上書きせず、出力名を見直しましょう。

3つなら、入力をもう1つ足します。2ファイルの例を実行済みでも結果を上書きしないよう、ここでは別の出力名を使っています。

copy /b /-y "input\01.txt"+"input\02.txt"+"input\03.txt" "output\combined-3files.txt" /b

なぜテキストファイルにも /b を付けるのか

copy は、複数ファイルを結合するときに /b を省くと、ASCIIテキストとして扱う動作になります。/a の入力では最初の Ctrl+Z(0x1A)が終端として扱われ、出力に /a を指定すると末尾に終端文字が付加されます。これはUTF-8やShift_JISへ変換する機能ではありません。

/b はファイル全体のバイトを対象にし、途中の Ctrl+Z もデータとして扱います。上の例は出力側にも /b を明記し、終端文字を追加しない指定にしています。詳しい位置ごとの意味は、Microsoft Learnのcopyリファレンスで確認できます。

ワイルドカードは入力の確認が必要

copy は *.txt のようなワイルドカードにも対応します。ただし、ファイル名順・日付順など、欲しい順序になると決めつけないでください。順序が重要な文書は、上の例のように入力名を明示する方法が分かりやすく確実です。

対象が多い場合は、まず次のコマンドで候補を一覧表示できます。これは確認用の名前順一覧であり、その表示順を別の copy *.txt に引き継ぐ命令ではありません。短いファイル名の対応などで想定外のファイルが一致する場合もあるため、一覧の中身も確認します。

dir /b /a:-d /o:n "input\*.txt"

入力の検索範囲に出力ファイルを置かないことが大切です。同じフォルダーの *.txt を読みながら、その中の結果ファイルへ追記するループは避けてください。過去の結果を再び入力に含める原因になります。

typeとリダイレクトを使うときの注意

type はテキストの内容を表示するcmdの組み込みコマンドです。小さい入力の確認には、次のように使えます。表示上の文字化けだけで、ファイル自体が壊れたと判断しないでください。

type "input\01.txt"

> は出力先を新規作成または上書きし、>> は追記します。リダイレクト先は入力の読み取り前に開かれるため、入力の指定を間違えると、既存の結果を空にしたり、不完全な結果を残したりする可能性があります。type と追記を繰り返す方法を、バイトを確実に保存する結合や文字コード変換の代わりには使わないでください。この記事では copy /b を主な方法にします。

PowerShellの type は Get-Content の別名で、cmdの type とは別の処理です。参照:type、cmd。

繰り返し作業:既存の結果を残すバッチファイル

毎回同じ2つのファイルを結合するなら、次の内容を join-text.bat として作業フォルダーに保存します。input と output は、このバッチファイルと同じ場所にあるフォルダーです。コマンドプロンプトからバッチを実行すれば、終了後もメッセージを確認できます。

この例は入力名と順序を固定し、入力の欠落・フォルダーの誤指定・空ファイル、出力フォルダーの作成失敗、既存の出力、コピーエラーを確認します。既存の結果を自動で削除したり、追記して膨らませたりしません。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
cd /d "%~dp0" || exit /b 1

if not exist "input\01.txt" goto badinput
if not exist "input\02.txt" goto badinput
if exist "input\01.txt\" goto badinput
if exist "input\02.txt\" goto badinput
for %%F in ("input\01.txt" "input\02.txt") do if %%~zF EQU 0 goto badinput

if not exist "output\" mkdir "output"
if not exist "output\" (
    echo ERROR: Cannot create output folder.
    exit /b 1
)
if exist "output\combined.txt" (
    echo STOP: output\combined.txt already exists.
    exit /b 1
)

copy /b /-y "input\01.txt"+"input\02.txt" "output\combined.txt" /b
if errorlevel 1 (
    echo ERROR: Copy failed. The output may be incomplete.
    exit /b 1
)
if not exist "output\combined.txt" (
    echo ERROR: Output file was not created.
    exit /b 1
)
echo Created output\combined.txt. Check its size and content.
exit /b 0

:badinput
echo ERROR: Inputs must be existing, nonempty text files.
exit /b 1

%~dp0 はバッチファイル自身の場所、%%~zF は対象ファイルのサイズです。%%F はバッチ内で使う書き方であり、このコード全体を対話用プロンプトへ貼り付けるものではありません。入力を増やす場合は、存在・サイズの確認と copy の入力列を両方更新します。

コピー失敗時には途中までの出力が残ることがあります。成功した結果として利用せず、原因を直してから新しい出力名でやり直してください。空ファイルを含む構成は、この例では誤指定を見つけやすいよう停止します。空の入力が意図したものなら、内容のないファイルを入力列から除くなど、扱いを先に決めてください。

参照:ifの条件とERRORLEVEL、forの変数修飾子、setlocal。

特定のキーワードを含むファイルだけ選ぶ

たとえば ERROR を含むログだけ結合したい場合は、まず検索と結合を分けます。次のコマンドは各入力に含まれる一致行数を表示するだけで、結果ファイルには書き込みません。

find /i /c "ERROR" "input\01.txt" "input\02.txt" "input\03.txt"

/i は大文字・小文字を区別しない指定、/c は一致した行の数を表示する指定です。件数が1以上のファイルを確認し、その名前だけを copy /b に希望の順序で列挙します。これは「一致行だけを抽出する」のではなく、「一致行を含むファイルの全文を結合する」用途です。

見つからない場合と検索失敗は区別してください。find の終了コードは、見つかった場合が0、見つからない場合が1、ファイル未検出や不正なオプションなどが2です。日本語の検索語や文字コードの異なる入力では、既知の一致箇所で検索できるかも確認します。詳しくはfindの公式リファレンスを参照してください。

結合後の確認とよくあるトラブル

サイズが予想と違う:重複や失敗を先に調べる

加工していない copy /b の連結なら、出力のバイト数は、正常に読み取った入力のバイト数の合計になります。次の表示で比較し、テキストエディターでも先頭・ファイルの境目・末尾を確認します。サイズが合うだけで内容の順序まで正しいと保証されるわけではありません。

dir /a:-d "input\01.txt" "input\02.txt" "output\combined.txt"

大きすぎる場合は、同じ入力を2回指定していないか、過去の出力を入力に含めていないか、>> で以前の結果へ追記していないかを調べます。小さすぎる場合は、入力の不足、コピーエラー、/b の指定漏れを確認します。原因が分からないまま空白や改行を削除しないでください。インデントや空行も、元データにとって必要な情報かもしれません。

行がくっつく:入力末尾の改行を確認する

copy /b はファイル間に改行を挿入しません。01.txt が改行なしの AAA、02.txt が BBB で始まるなら、境界は AAABBB になります。別々の行にしたい場合は、元データをバックアップしたうえで、作業用コピーの末尾に必要な改行を追加します。CRLFとLFの混在も、用途に応じて先にそろえましょう。

文字化けや見えない文字:文字コードとBOMを確認する

UTF-8とShift_JIS、UTF-16などをそのまま連結しても、1つの文字コードに自動変換されません。さらに、同じ文字コードでも各ファイルにBOMがあると、2つ目以降のBOMも本文の途中に残ります。閲覧ソフトによって見えない文字として扱われたり、後続の処理に影響したりするため、単に「UTF-8同士だから大丈夫」とは判断できません。

文字コードの変換が必要なら、元ファイルとは別の作業用コピーを用意し、入力の文字コードを確認してから変換します。WindowsにあるPowerShellでも Get-Content や Set-Content の -Encoding を利用できます。ただし、Windows PowerShell 5.1とPowerShell 7系では既定値やUTF-8のBOMの扱いが違います。読み取り・書き込みの両方の文字コードを明示し、改行の扱いも別途確認してください。

また、Get-Content は通常は行ごとに読み取るため、そのまま書き戻す処理をバイト単位の複製と同一視しないことが大切です。参照:PowerShellの文字エンコード、Get-Content、Set-Content。

アクセス拒否・ファイル未検出・構文エラー

  • アクセス拒否:出力フォルダーの書き込み権限、既存出力の読み取り専用属性、別アプリによる使用状況、空き容量などを確認します。まず自分が書き込める作業フォルダーを使い、安易に管理者実行へ切り替えないでください。
  • ファイル未検出:作業場所、拡張子、ファイル名、引用符を確認します。エクスプローラーで拡張子を表示し、実際には 01.txt.txt などになっていないか調べます。
  • 構文が合わない:実行しているのがcmdかPowerShellかを確認します。cmd用の copy /b やバッチの構文を、そのままPowerShell用の構文と混ぜないでください。

まとめ:順番・保存先・文字コードを決めてから実行する

同じ文字コードのテキストをそのままつなぐなら、入力を順番に書いた copy /b が出発点です。出力は入力とは別のフォルダーの未使用名にし、既存ファイルの削除や無条件の追記を避けます。実行後はエラー表示だけでなく、サイズと境界の内容まで確認してください。

BOMの整理、改行の補完、文字コード変換、CSVなどの構造の調整が必要な場合は、その処理を単純な連結と分けて考えると、意図しないデータ変更を防ぎやすくなります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次