命名って難しい

変数、関数、クラスなどなど実装より命名に毎回悩むタイプの人間による技術についてのメモ。

Windowsのバッチのライブラリを作り始めた(ヘルプ出力バッチ&テキストの行数出力バッチ)

なお不定期。

業務で使う特定の処理のバッチを作ってライブラリにしようかなと思って少し書いてみた。 ブログのタイトルにもしてるんですけど、なんでも作る時に命名が難しすぎますね。。。 まだライブラリ未満です。

将来これを拡張して便利なものに~~~とか思ってたんですけど 既にあったりするのかな。 勉強にはなったけれど貢献になるか割と微妙ですね!

面白かったのでとりあえず記事に残しときます。

ヘルプを出力するバッチ

概要

ヘルプの前提は以下です。

  • バッチの中にヘルプ文言を全部書く。
  • ヘルプは引数エラーの時のみ出力する(/h)など未対応

ファイル名称

ShowHelp.bat

ソースコード

@echo off
setlocal enabledelayedexpansion

if "%1"=="" (
  echo 引数が不正です。ヘルプを表示します。
  "%~f0" "::" "%~f0"
  goto :EOF
)

goto TopOfCode

::ShowHelp.bat - 指定のバッチファイルのヘルプを表示します。
::
::使用法
::    ShowHelp [コメントアウト文字列] [ファイルパス] 
::
::詳細
::    指定のバッチファイル内のコメントアウト文字列を使ったヘルプを表示します。
::
::例
::    以下の内容のファイルのヘルプを表示する時
::      対象ファイル    :Test.bat
::      コメントアウト文字列://
::    "ShowHelp.bat" "//" "Test.bat"

:TopOfCode

set annotation=%~1
set filepath=%~f2
for /f "usebackq delims=" %%a in (`findstr /R "^%annotation%" "%filepath%"`) do (
  set cmt=%%a
  set cmt=!cmt:%annotation%=!
  echo.!cmt!
)

endlocal

テキストファイルの行数を出力するコマンド

概要

Windowsバッチにはwcがないのでつくりました。 行数のみをぱっと出力するコマンド。

ファイル名称

CountLine.bat

ソースコード

@echo off
setlocal

REM 引数
set drive=%~d1
set filePath=%~f1

if "%filePath%"=="" (
  echo 引数が不正です。ヘルプを表示します。
  ShowHelp "::" "%~f0"
  goto :EOF
)

if not exist "%filePath%" (
  echo.0
  goto :EOF
)

goto TopOfCode

::CountLine.bat
::
::使用法
::    CountLine [TEXT FILE] 
::詳細
::    パラメータで指定したテキストファイルの行数を取得します。
::

:TopOfCode

pushd %~dp0

REM 指定のファイルパスがUNC形式の場合、参照する場所が違う。
set tokensNumber=3
If "%drive%"=="\\" set tokensNumber=2

for /f "usebackq tokens=%tokensNumber% delims=:" %%a in (`find /v /c "" "%filePath%"`) do (
  set count=%%a
)

echo %count: =%

popd
endlocal

以上!