役演亭 -Yakuentei- Roleplay with your own characters.
  1. ホーム
  2. 技術記事
  3. Windows

Windows 標準コマンドのみで行数の合計・内訳を調べる方法

公開日 (Published) : 更新日 (Modified) :

Windows 標準コマンドのみでソースコード等の合計・内訳行数を調べる方法の紹介です。

【Windows 標準コマンドのみ】ソースコードの合計・内訳行数を出す (Linux の grep, wc 相当)

追加でインストールするツール等は一切無しで、Windows 標準コマンドである find および findstr をもちいてソースコード等の行数 (合計、内訳) を調べる方法を紹介します。

目次

まえがき

ソースコード等の行数をカウントする手法としては、Linux など UNIX 系の wc コマンドが有名ですが、Windows にもそこそこ強力なコマンド群が揃っているため、(wc コマンドほどは便利で強力でないにしろ) Windows でも実現可能です。

本記事で紹介する find および findstr コマンドは、UNIX 系の wc および grep に相当する機能を持ったコマンドです。

なお、find および findstr コマンドそのものの解説は Web 上に数多く存在するため、本記事ではコマンドの詳細説明は割愛し、具体例の紹介をメインにしています。

ただし、大抵の Windows コマンドは /? を付けることで説明を見られます (UNIX 系の --help に相当) ので、ターミナルに慣れている方なら Web 検索する必要は無いかもしれません。

find /?
findstr /?

コマンドプロンプトに直接打ち込む場合

コマンドプロンプトとバッチファイルで、一部、入力の仕方が異なる箇所があるため、まずはコマンドプロンプトの場合から紹介していきます。

必要な準備 (コマンドプロンプト編)

前提条件として、ソースコード等、行数を計測したいファイルの一式 (本記事の例では C# のソースコード) が、以下のように格納されているものとします。

サブフォルダ内のファイルも行数の計測対象になりますので安心して下さい。

Windows エクスプローラーにて、ソースコードが格納されているフォルダーのパスをコピー

これから紹介するコマンドを、コマンドプロンプトで動かす場合は、まず cd コマンドを使って、上記のフォルダの場所に移動する必要があります。

Windows エクスプローラー側でパスをコピーした後、以下のように右クリックでコマンドプロンプトにパスを貼り付ける方法がおすすめです。

コマンドプロンプトに cd および半角スペースを打ち込んだ後、右クリックでパスを貼り付け

行数の「合計」を調べる方法と、その出力例

以下のコマンドで、現在のディレクトリおよびすべてのサブディレクトリ内にある、指定した拡張子のファイルの合計行数を調べることができます。

本例では、実際に拙作のゲーム「地底防衛軍」のソースコード (C#) を例に、行数の計測を行っています。

C:\UDForce_Src>findstr /r /s .* *.cs | find /v /c ""
20502

上記では C# ソースコードを対象にしているため *.cs としていますが、読者の方で実際に使用される際は、*.cs の部分を適切な拡張子に置き換えてください。なお、複数の拡張子を指定する場合、半角スペースで区切れば OK です。

簡単な説明

下記の合わせ技により、全行計測処理を実現しています。

  • findstr の /r で正規表現検索を有効化
  • findstr の /s でサブディレクトリ検索 (再帰) を有効化
  • 正規表現の「.*」ですべての行が検索結果としてマッチするようにする
    • つまりすべてのソースコードの中身がすべて標準出力される
  • ワイルドカード「*.cs」で、C# ソースコード (拡張子 cs) のみに絞る
  • パイプ「|」で、標準出力の内容を find コマンドにリダイレクト
  • find の /v, /c を同時指定かつ空文字 ("") 指定で、全行を無条件カウント

行数の「内訳」を調べる方法と、その出力例

findstr にはサブディレクトリを検索するオプション (/s) がありますが、find には無いため、以下のように for コマンドを使う必要があります。

C:\UDForce_Src>echo off & (for /r %a in (*.cs) do find /v /c "" %a) & echo on
---------- C:\UDFORCE_SRC\SUBEHAVIOURBACK.CS: 11
---------- C:\UDFORCE_SRC\SUBEHAVIOURMAIN.CS: 56
---------- C:\UDFORCE_SRC\SUEDITOR.CS: 335
---------- C:\UDFORCE_SRC\SUEDITORUNICODERANGE.CS: 474
---------- C:\UDFORCE_SRC\SUGAME\SCENE00LOAD.CS: 41
---------- C:\UDFORCE_SRC\SUGAME\SCENE01LOGO.CS: 120
---------- C:\UDFORCE_SRC\SUGAME\SCENE02TITLE.CS: 280
---------- C:\UDFORCE_SRC\SUGAME\SCENE03OPTION.CS: 406
---------- C:\UDFORCE_SRC\SUGAME\SCENE04PROLOGUE.CS: 162
---------- C:\UDFORCE_SRC\SUGAME\SCENE11STAGESEL.CS: 879
---------- C:\UDFORCE_SRC\SUGAME\SCENE12CHARMAKE.CS: 439
---------- C:\UDFORCE_SRC\SUGAME\SCENE13EQUIP.CS: 637
---------- C:\UDFORCE_SRC\SUGAME\SCENE21BATTLE.CS: 2480
---------- C:\UDFORCE_SRC\SUGAME\SCENE22REWARD.CS: 669
---------- C:\UDFORCE_SRC\SUGAME\SCENE23EPILOGUE.CS: 205
---------- C:\UDFORCE_SRC\SUGAME\SUGAME.CS: 134
---------- C:\UDFORCE_SRC\SUGAME\SUGAMEAI.CS: 1124
---------- C:\UDFORCE_SRC\SUGAME\SUGAMEANIM.CS: 1015
---------- C:\UDFORCE_SRC\SUGAME\SUGAMEEVENT.CS: 2348
---------- C:\UDFORCE_SRC\SUGAME\SUGAMEROLL.CS: 266
---------- C:\UDFORCE_SRC\SUGAME\SUGAMESAVE.CS: 875
---------- C:\UDFORCE_SRC\SUGAME\SUGAMESTAT.CS: 800
---------- C:\UDFORCE_SRC\SUGAME\SUGAMETEXT.CS: 3159
---------- C:\UDFORCE_SRC\SUGAME\SUGAMEUI.CS: 1065
---------- C:\UDFORCE_SRC\SUGAMEMGR\SUGAMEMGR.CS: 299
---------- C:\UDFORCE_SRC\SUGAMEMGR\SUGAMEMGRASTDEF.CS: 412
---------- C:\UDFORCE_SRC\SUGAMEMGR\SUGAMEMGRIMG.CS: 771
---------- C:\UDFORCE_SRC\SUGAMEMGR\SUGAMEMGRIMGRSRC.CS: 252
---------- C:\UDFORCE_SRC\SUGAMEMGR\SUGAMEMGRINPUT.CS: 165
---------- C:\UDFORCE_SRC\SUGAMEMGR\SUGAMEMGRSCENE.CS: 44
---------- C:\UDFORCE_SRC\SUGAMEMGR\SUGAMEMGRSND.CS: 163
---------- C:\UDFORCE_SRC\SUGAMEMGR\SUGAMEMGRTIMER.CS: 84
---------- C:\UDFORCE_SRC\SUSTEAMMGR\SUSTEAMMGR.CS: 99
---------- C:\UDFORCE_SRC\SUSTEAMMGR\SUSTEAMMGRACHIEVE.CS: 233

上記の出力を合計すると 20502 になっている (検算方法は後述) ため、最初の例と辻褄が合っています。

簡単な説明

下記の合わせ技により、各ファイル個別の計測処理を実現しています。

  • echo off で、for の各ループのコマンド出力を抑制
  • ループさせる部分全体を括弧で括る (括らないと、後続の echo on もループ対象になる)
  • for コマンドの /r でサブディレクトリ検索 (再帰) を有効化
  • for コマンドのループ変数 (ファイル名の格納先) を %a とする。
    • 注:変数は %a ~ %z までの 26 種類しか使用できないという制約あり
  • ワイルドカード「*.cs」で、C# ソースコード (拡張子 cs) のみに絞る
  • find の /v, /c を同時指定かつ空文字 ("") 指定で、全行を無条件カウント
  • ループ完了後、echo off でコマンド出力を元に戻す

補足:Excel を使用した検算方法

Excel があれば、行数の内訳の合計値が、最初の例 (「合計」を調べる方法) のコマンド出力と一致しているかどうかを簡単に検算することができます。

  • テキストエディター上で「: 」(半角コロンとスペースの塊) をタブ文字に置換して、Excel に直接コピペすると、2 列目が各ファイルの行数だけになるため、合計値を調べることが簡単にできます。
  • または、タブ文字ではなくカンマ (,) に置換して CSV 形式として保存し、Excel で開く方法でも可能です。

Excel を使用した検算の例

バッチファイルで実行する場合

Windows のバッチファイル上では、「%」が別の意味 (=バッチファイルに渡した引数) を持つため、バッチファイルで実行する場合は「%」を「%%」に置き換える必要があります。

必要な準備 (バッチファイル編)

前提条件として、ソースコード等、行数を計測したいファイルの一式 (本記事の例では C# のソースコード) と同じ場所に、以下のようにバッチファイルを置くものとします。(※ ファイル名は任意です)

サブフォルダ内のファイルも行数の計測対象になりますので安心して下さい。

ソースコードを格納したフォルダと同じ場所にバッチファイルを置くことで実行が可能。

行数の「合計」を調べる場合

こちらは「%」が入っていませんので、置き換えは不要です。

findstr /r /s .* *.cs | find /v /c ""

行数の「内訳」を調べる場合

2 箇所「%」が使用されていますので、「%%」に置き換える必要があります。

echo off & (for /r %%a in (*.cs) do find /v /c "" %%a) & echo on

追加のテクニック

バッチファイルに慣れている方には説明不要だと思いますが、バッチファイルとしての使い勝手を上げるためのテクニックを紹介します。

テクニック 1 : ウィンドウがすぐ消えないようにする

バッチファイルに慣れている方には説明不要だと思いますが、pause コマンドを入れないとコマンドプロンプトがすぐ消えてしまうため、通常は pause を入れると良いでしょう。

また、わざわざ 1 行で書く必要もないため、& は改行に置き換えた方が見やすくなります。

findstr /r /s .* *.cs | find /v /c ""
pause
echo off
for /r %%a in (*.cs) do find /v /c "" %%a
echo on
pause

テクニック 2 : 計測結果を画面ではなくファイルに出力する

こちらもバッチファイルに慣れている方には説明不要だと思いますが、計測結果を画面ではなくファイルに出したい場合はリダイレクト機能を使うと良いでしょう。

注意点として、for コマンドを使った場合は「コマンドが複数回実行されます」ので、追記モード (>>) でリダイレクトする必要があります。

findstr /r /s .* *.cs | find /v /c "" > count_total.txt
echo. > count_each.txt
for /r %%a in (*.cs) do find /v /c "" %%a >> count_each.txt

なお、この例では画面がすぐに消えても問題ないと思われますので、pause を消しました。

ただし、一瞬出てくる黒いウィンドウにコマンド文字列が表示されるのが気になる方は、以下のように @echo off と echo on を挟むようにすると良いでしょう。

@echo off
findstr /r /s .* *.cs | find /v /c "" > count_total.txt
echo. > count_each.txt
for /r %%a in (*.cs) do find /v /c "" %%a >> count_each.txt
echo on

補足:拡張子を複数指定したい場合

拡張子を複数指定したい場合は、半角スペースで区切れば OK です。

本例では、拙作の (旧名義時代の) ゲーム「四面楚歌3」のソースコード (HSP および C/C++) を例に、行数の計測を行っています。

拡張子を「複数」指定したい場合は「半角スペース」で区切る。

コマンドプロンプトに直接打ち込む場合 (変数を % 表記)

findstr /r /s .* *.cpp *.h *.as | find /v /c ""
echo off & (for /r %a in (*.cpp *.h *.as) do find /v /c "" %a) & echo on

バッチファイルで実行する場合 (変数を %% 表記)

findstr /r /s .* *.cpp *.h *.as | find /v /c ""
echo off & (for /r %%a in (*.cpp *.h *.as) do find /v /c "" %%a) & echo on
pause

おわりに

本記事では、「ソースコード等の行数 (合計、内訳) を調べる」という具体的な事例に着目して、find と findstr コマンドの紹介を行いました。

コマンドプロンプトやシェル等の各種ターミナルの扱いに慣れている方には冗長な説明も多いと思いますが、慣れていなければなかなか組み合わせ方を思いつくことができないのも事実ですし、Google 検索したからと言って必ずしも目的の事例 (虎の巻) に辿り着けるとは限りません。

本記事も具体例ベースの「虎の巻」寄りの内容となりましたが、単なる「虎の巻」には留めず、簡単な説明も付けたため、本記事の説明をきっかけにコマンドの組み合わせ方や応用方法に慣れていただくことができたら幸いです。

主な更新履歴

  • 2024-04-20
    • 行数の計測に使用する例を差し替え。
    • 拡張子を複数指定する場合の例を追加。
  • 2023-11-20
    • Excel を使用した検算方法のスクリーンショットを追加。
  • 2023-04-29
    • コマンドプロンプト、バッチファイルそれぞれの事例について、「必要な準備」のための説明とスクリーンショットを追加。
  • 2023-04-04
    • 初版

「Windows」一覧

Windows 標準機能のみで動画をキャプチャーする方法
Windows 標準搭載のゲームバーでアプリ画面を動画としてキャプチャーする方法です。
Windows 標準機能のみでグラフをプロットする方法
Windows 標準搭載の PowerShell スクリプトでグラフを作成する方法の紹介です。
Windows 標準コマンドのみで行数の合計・内訳を調べる方法
(現在開いているページです)
Windows 標準機能のみで数式を HTML のように描画する方法
Windows 標準搭載の Microsoft Edge で HTML 風に数式を描画する方法の紹介です。