【bat】typeコマンド完全ガイド|ファイル表示・結合・パイプ・文字コード・for /f連携まで徹底解説

type はバッチファイルでテキストファイルを扱う場面で最も頻繁に使うコマンドのひとつです。単純なファイル表示だけでなく、複数ファイルの結合・パイプによる絞り込み・for /f での行ごと処理まで、組み合わせると非常に強力です。一方で文字コードの罠にはまると文字化けが避けられません。この記事では基本から応用まで体系的に解説します。

この記事でわかること

  • type コマンドの基本構文とオプション
  • 複数ファイルを一括表示・結合する方法
  • more と組み合わせたページ送り表示
  • find / findstr とのパイプ連携
  • for /f で1行ずつ処理する方法
  • UTF-8 / BOM / cp932 の文字コード問題と対処法
  • 実践例3本(ログ確認・ファイル結合・行フィルタリング)
スポンサーリンク

1. type コマンドの基本構文

type [ファイル名]
書き方 説明
type ファイル名 指定したファイルの内容を標準出力に表示 type log.txt
type "パスにスペース" パスにスペースを含む場合はダブルクォートで囲む type "C:My Folderdata.txt"
type file1.txt file2.txt 複数ファイルを連続して表示(区切り線なし) type a.txt b.txt
type *.txt ワイルドカードで複数ファイルを一括表示 type *.log

1-1. 単一ファイルを表示する

@echo off
type C:logsapp.log

1-2. ファイルが存在するか確認してから表示する

@echo off
if not exist "app.log" (
    echo [ERROR] app.log が見つかりません。
    exit /b 1
)
type app.log
type はエラーを標準出力に混ぜる
存在しないファイルを type に渡すと、「指定されたファイルが見つかりません」というエラーメッセージが 標準出力(stdout)に出力されます(stderr ではありません)。if not exist で事前にチェックするか、2>nul でエラーを捨てるようにしてください。

1-3. ワイルドカードで複数ファイルを一括表示する

@echo off

:: カレントディレクトリの全 .txt ファイルを連続表示
type *.txt

:: サブフォルダも含めて表示したい場合は for /r を使う
for /r "C:logs" %%F in (*.log) do (
    echo ===== %%F =====
    type "%%F"
    echo.
)
ワイルドカードは「連続表示」でファイル間の区切りがない
type *.txt は複数ファイルを区切りなしで繋げて表示します。どのファイルの内容かわからなくなるため、for ループで echo ===== %%F ===== のようにファイル名を挟むと見やすくなります。

2. more コマンドと組み合わせてページ送り表示する

長いファイルを type するとスクロールしてしまいます。more コマンドと組み合わせると、Enterキーで1行ずつ、Spaceキーで1ページずつ送れます。

:: type の出力を more にパイプ
type large_log.txt | more

:: more コマンドに直接ファイルを渡す方法でも同じ
more large_log.txt

:: 行番号付きで表示する
more /e large_log.txt
キー操作 more での動作
Enter 1行進む
Space 1ページ進む(画面いっぱい)
F 次のファイルへ(複数ファイル指定時)
Q 表示を中断して終了
= 現在の行番号を表示

3. リダイレクトと組み合わせてファイルを結合する

type>(上書き)/ >>(追記)を組み合わせると、複数ファイルを1つに結合できます。

@echo off

:: ファイルを上書き結合(file1 の内容 → output.txt)
type file1.txt > combined.txt

:: さらに追記結合(file2 の内容を追加)
type file2.txt >> combined.txt
type file3.txt >> combined.txt

echo 結合完了: combined.txt

3-1. ワイルドカード一括結合

@echo off

:: カレントの全 .log を 1 ファイルに結合
type *.log > all_logs.txt

:: 注意: 結合先ファイルが *.log に含まれる場合は無限ループの危険
:: 結合先は別の拡張子にするか別フォルダに作成すること
結合先が対象ワイルドカードに含まれると壊れる
type *.txt > output.txtoutput.txt 自体が *.txt に含まれるため、自分自身を読み込んでファイルが壊れます。結合先のファイル名は別の拡張子(.out など)にするか、別のフォルダに出力してください。

3-2. ヘッダー行を挿入しながら結合する

@echo off
setlocal

:: 各ファイルの前にファイル名のヘッダーを挿入しながら結合
if exist combined.txt del combined.txt

for %%F in (C:reports*.csv) do (
    echo ===== %%~nxF ===== >> combined.txt
    type "%%F" >> combined.txt
    echo. >> combined.txt
)
echo 結合完了

リダイレクト(>>>2>&1)の詳細は リダイレクト完全ガイド も参照してください。

4. find / findstr とのパイプ連携

type の出力を findfindstr にパイプすることで、特定の文字列を含む行だけを絞り込んで表示できます。

4-1. find との組み合わせ(完全一致)

@echo off

:: "ERROR" という文字列を含む行のみ表示
type app.log | find "ERROR"

:: 大文字小文字を区別しない場合は /i オプション
type app.log | find /i "error"

:: "ERROR" を含まない行を表示(否定)
type app.log | find /v "ERROR"

:: 一致行数のみを表示
type app.log | find /c "ERROR"

4-2. findstr との組み合わせ(正規表現・複数条件)

@echo off

:: 正規表現で "WARN" または "ERROR" を含む行を表示
type app.log | findstr /r "WARN ERROR"

:: 複数パターンをファイルで指定
type app.log | findstr /g:patterns.txt

:: 行番号付きで表示
type app.log | findstr /n "ERROR"

:: 大文字小文字を区別しない + 正規表現
type app.log | findstr /i /r "error|warn|fatal"

findstr の詳細な正規表現・複数ファイル検索については FINDSTRコマンド完全ガイド を参照してください。

4-3. 件数を数えてエラー件数をチェックする

@echo off
setlocal

:: ERRORの件数を変数に格納
for /f %%N in ('type app.log ^| find /c "ERROR"') do set ERROR_COUNT=%%N

echo エラー件数: %ERROR_COUNT%

if %ERROR_COUNT% gtr 0 (
    echo [ALERT] エラーが %ERROR_COUNT% 件検出されました。
    exit /b 1
)
echo [OK] エラーなし

5. for /f と組み合わせて1行ずつ処理する

for /f "usebackq" %%L in ("ファイル名") でファイルを1行ずつ読み込めます。type をパイプ経由で渡す方法もあります。

5-1. ファイルを1行ずつ読み込む(基本形)

@echo off

:: usebackq でファイルパスをダブルクォートで囲める
for /f "usebackq delims=" %%L in ("data.txt") do (
    echo 行: %%L
)
delims= を忘れると行が空白で切れる
for /f %%L in (...) のデフォルトは空白・タブを区切り文字として先頭トークンのみ取得します。行全体を取得するには delims=(区切り文字なし)を必ず指定してください。

5-2. 先頭行(ヘッダー)をスキップして読み込む

@echo off

:: 先頭1行をスキップ(CSVのヘッダースキップなど)
for /f "usebackq skip=1 delims=" %%L in ("data.csv") do (
    echo データ行: %%L
)

5-3. type のパイプ経由で for /f に渡す

@echo off

:: type の出力を findstr でフィルタしてから for /f に渡す
:: (#で始まるコメント行を除外しながら処理)
for /f "delims=" %%L in ('type config.txt ^| findstr /v /b "#"') do (
    echo 設定: %%L
)

:: 空白行と#コメントを両方除外する場合
for /f "delims=" %%L in ('type config.txt ^| findstr /v /b "#" ^| findstr /v /r "^$"') do (
    echo 設定: %%L
)
for /f は空行を無視する
for /f は空行を自動的にスキップします。空行も処理対象にしたい場合は、type の出力を一時ファイルに書いてから別の方法(type そのまま or PowerShell)で処理してください。

5-4. 指定行目だけ取得する(先頭N行・末尾N行)

@echo off
setlocal enabledelayedexpansion

:: 先頭3行のみ処理
set LINE=0
for /f "usebackq delims=" %%L in ("data.txt") do (
    set /a LINE+=1
    if !LINE! leq 3 echo 先頭: %%L
)

:: 特定の行(5行目)のみ取得
set LINE=0
for /f "usebackq delims=" %%L in ("data.txt") do (
    set /a LINE+=1
    if !LINE! equ 5 echo 5行目: %%L
)

6. 文字コードの落とし穴と対処法

Windows バッチファイルのコードページは既定で cp932(Shift_JIS)です。UTF-8 ファイルを type すると文字化けします。

ファイルの文字コード type の表示結果 対処
cp932 (Shift_JIS) 正常 対処不要
UTF-8 (BOM付き) BOMが □ や特殊文字として表示されることがある chcp 65001 後に表示
UTF-8 (BOMなし) 文字化けする chcp 65001 後に表示
UTF-16 LE 文字化け(binary的に見える) PowerShell Get-Content を使う

6-1. UTF-8 ファイルを正しく表示する

@echo off

:: コードページを UTF-8 に変更してから type
chcp 65001 >nul
type utf8_file.txt

:: 処理後は cp932 に戻す(他のコマンドへの影響を防ぐ)
chcp 932 >nul
for /f + UTF-8 は組み合わせに注意
chcp 65001 後に for /f で UTF-8 ファイルを読み込むと、日本語が途中で切れたり文字化けするケースがあります。信頼性が高いのは PowerShell Get-Content -Encoding UTF8 を利用する方法です。

6-2. PowerShell で UTF-8 ファイルを確実に表示・処理する

@echo off

:: PowerShell で UTF-8 ファイルを表示
powershell -Command "Get-Content -Path 'utf8_file.txt' -Encoding UTF8"

:: 行ごとに処理したい場合は PowerShell でループ
powershell -Command "Get-Content 'data.txt' -Encoding UTF8 | ForEach-Object { Write-Host $_ }"

:: UTF-8 で書かれたログからエラー行だけ抽出
powershell -Command "Get-Content 'app.log' -Encoding UTF8 | Where-Object { $_ -match 'ERROR' }"

7. 実践例3本

実践例1:ログファイルの最新エラー確認バッチ

@echo off
setlocal enabledelayedexpansion

:: ログファイルのパス
set LOGFILE=C:applogsapp.log
set ERROR_KEYWORD=ERROR
set WARN_KEYWORD=WARN

if not exist "%LOGFILE%" (
    echo [ERROR] ログファイルが見つかりません: %LOGFILE%
    exit /b 1
)

:: ログファイルのサイズ確認
for %%F in ("%LOGFILE%") do set SIZE=%%~zF
echo ファイルサイズ: %SIZE% bytes

:: エラー件数・警告件数をカウント
for /f %%N in ('type "%LOGFILE%" ^| find /c "%ERROR_KEYWORD%"') do set ERR_CNT=%%N
for /f %%N in ('type "%LOGFILE%" ^| find /c "%WARN_KEYWORD%"') do set WARN_CNT=%%N

echo ----------------------------------------
echo ERROR: %ERR_CNT% 件 / WARN: %WARN_CNT% 件
echo ----------------------------------------

:: エラーがあれば内容を表示
if %ERR_CNT% gtr 0 (
    echo.
    echo [ERROR 一覧]
    type "%LOGFILE%" | findstr /i "%ERROR_KEYWORD%"
    exit /b 1
)

echo [OK] エラーなし
exit /b 0

実践例2:複数のCSVファイルを結合してヘッダーを1行にまとめる

@echo off
setlocal enabledelayedexpansion

:: 結合先ファイル
set OUTPUT=C:workcombined.csv
set SRCDIR=C:workinput
set HEADER_WRITTEN=0

if exist "%OUTPUT%" del "%OUTPUT%"

for %%F in ("%SRCDIR%*.csv") do (
    echo [INFO] 処理中: %%~nxF

    if !HEADER_WRITTEN! equ 0 (
        :: 最初のファイルはヘッダーごと結合
        type "%%F" >> "%OUTPUT%"
        set HEADER_WRITTEN=1
    ) else (
        :: 2ファイル目以降はヘッダー行(1行目)をスキップして結合
        for /f "usebackq skip=1 delims=" %%L in ("%%F") do (
            echo %%L >> "%OUTPUT%"
        )
    )
)

:: 結合結果の行数確認
for /f %%N in ('type "%OUTPUT%" ^| find /c /v ""') do set LINES=%%N
echo 結合完了: %LINES% 行 → %OUTPUT%

実践例3:設定ファイルを読み込んで動的にバッチ処理する

@echo off
setlocal

:: 設定ファイル(config.txt)の形式:
:: # コメント行(#で始まる行は無視)
:: TARGET_DIR=C:data
:: BACKUP_DIR=D:backup
:: RETAIN_DAYS=30

:: コメント行(#)を除外しながら設定を読み込んで環境変数にセット
:: findstr /v /b "#" で#始まり行を除外 → = を含む行を set に渡す
for /f "delims=" %%L in ('type config.txt ^| findstr /v /b "#"') do (
    echo %%L | findstr "=" >nul && set "%%L"
)

:: 読み込んだ設定を確認
echo TARGET_DIR  = %TARGET_DIR%
echo BACKUP_DIR  = %BACKUP_DIR%
echo RETAIN_DAYS = %RETAIN_DAYS%

:: 設定値が未定義の場合はエラー
if not defined TARGET_DIR (
    echo [ERROR] config.txt に TARGET_DIR が設定されていません。
    exit /b 1
)

:: 実際の処理(例:バックアップ)
robocopy "%TARGET_DIR%" "%BACKUP_DIR%" /mir /r:2 /w:5 /nfl /ndl
echo [OK] バックアップ完了

設定ファイルの行ごと処理や文字列操作の詳細は CSVファイルを読み込む完全ガイド も参照してください。

8. type コマンドの制限と注意事項

項目 内容 代替手段
バイナリファイルの表示 文字化け・端末が壊れる可能性 certutil -hexdump / format-hex(PS)
末尾の改行処理 ファイルの最後が改行なしでも結合時に改行なしで繋がる 結合前に echo. で改行を手動追加
行番号の付与 標準では行番号を表示できない find /n "" または findstr /n "" を使う
特定の行だけ表示 先頭N行・末尾N行の絞り込み機能なし for /f skip= または PowerShell Select-Object
ファイルの書き込み type は読み取り専用 echo + >> または set /p =

行番号を付けて表示する(find /n の活用)

@echo off

:: find /n で行番号付き表示([行番号]内容 の形式)
type data.txt | find /n ""

:: findstr /n の場合(同様の形式)
type data.txt | findstr /n ""

テキストファイルの作成方法については テキストファイルを作成する方法、ソート・重複除去については テキストファイルをソートする完全ガイド を参照してください。

9. まとめ:チートシート

やりたいこと コマンド例
ファイルを表示 type file.txt
複数ファイルを連続表示 type file1.txt file2.txt
ページ送り type file.txt | more
ファイルを結合(上書き) type file1.txt file2.txt > out.txt
ファイルに追記 type file.txt >> out.txt
特定文字列を含む行のみ表示 type file.txt | find "ERROR"
行番号付きで表示 type file.txt | find /n ""
エラー行数をカウント type file.txt | find /c "ERROR"
1行ずつ処理 for /f "usebackq delims=" %%L in ("file.txt") do ...
UTF-8 ファイルを表示 chcp 65001 >nul && type file.txt

FAQ

Qtype コマンドと copy /b、xcopy の違いは何ですか?

Atype はテキストファイルの内容を標準出力に表示するコマンドです。copy /b はファイルをバイナリのままコピー・結合するコマンドです。テキストファイルの結合なら type file1.txt file2.txt > out.txt でもcopy file1.txt+file2.txt out.txt でも同じ結果になります。ただし type のリダイレクト方式の方が直感的でスクリプトに組み込みやすいです。

Qtype コマンドでバイナリファイルを表示するとどうなりますか?

A端末の制御文字が混入して表示が崩れたり、ターミナルが反応しなくなることがあります。バイナリファイルを確認したい場合は certutil -hexdump ファイル名(16進ダンプ)または PowerShell の Format-Hex ファイル名 を使ってください。

Qtype で表示したとき改行コードは変換されますか?

Aはい、type はテキストモードで読み込むため、CRLF(Windows形式)はそのまま表示されますが、LF のみ(Unix形式)のファイルを type でリダイレクト結合すると改行が消えて1行になることがあります。Unix形式ファイルを扱う場合は PowerShell の Get-Content / Set-Content を使ってください。

Qfor /f でファイルを読み込むと空行が消えてしまいます。対処法は?

Afor /f は仕様として空行をスキップします。空行を保持したまま処理したい場合は、type でリダイレクトした一時ファイルを PowerShell で処理するか、for /f "eol=§"(存在しない文字をeolに指定)で空行スキップを回避する方法があります。ただし完全な空行保持は powershell -Command "Get-Content file.txt" が最も確実です。

Qtype コマンドでファイルが見つからない場合のエラーを非表示にしたい。

Atype のエラーは stderr ではなく stdout に出力されるため、2>nul では消せません。if exist ファイル名 (type ファイル名) で事前チェックするか、type ファイル名 | findstr /v "指定されたファイルが見つかりません" でエラーメッセージをフィルタリングしてください。

Qtype で日本語が文字化けします。

A表示先の端末のコードページとファイルの文字コードが一致していないのが原因です。ファイルが UTF-8 の場合は chcp 65001 >nul を先頭に追加してください。ファイルが Shift_JIS の場合は chcp 932 >nul(既定値)で正常に表示されます。それでも化ける場合は UTF-16 LE の可能性があるため PowerShell の Get-Content を使ってください。