概要

BATファイルでヒアドキュメントっぽいことを実現します。
これを使えばいろいろと便利になりそうです。※実装には、やんごとなき理由でJScriptを使用しています。
(DOS-BAT の for /f で回すと、空行が間引かれてしまうというアレの所為)

使い方

BATファイル内の、到達できない場所(exitやgoto :eofの後ろなど)にヒアドキュメントっぽいもの(ニアドキュメント)を記述します。
ニアドキュメントの範囲は、任意の文字に「>」(始端)と「<」(終端)を付与し指定します。

1
2
3
4
5
6
7
rem 始端・終端をあらわす文字列として「HERE」を使用する場合
HERE>
1
2
3
&lt;HERE

実際に出力する際は、「NearDoc.bat」をCallし、

  • 第一引数 … 自BATのパス
  • 第二引数 … ヒアドキュメントの区切り文字
を渡します。
1
2
Call NearDoc.bat "%~0" HERE

標準出力に、「HERE>」~「<HERE」の間に記述されている内容が出力されます。

1
2
3
1
2
3

標準出力に出るので、パイプで繋いでsortやらfindstrやらでごにょごにょできます。
また、区切り文字さえ被らなければ、ニアドキュメントは複数記述可能です。
(テストコードでも複数を使用しています)

ソースコード

いつもと同様、上が話題のコードで、下が簡単なテストコードです。[NearDoc.bat]

@if (1==1) /*
@if "%~2"=="" goto :USAGE
@if "%~1"=="/?" goto :USAGE
@rem ---------------------------
:MAIN
@CScript //nologo //E:JScript "%~f0" "%~1" "%~2"
@exit /b
@rem ---------------------------
:USAGE
@echo USAGE:Call NearDoc.bat "%~0" ヒアドキュメントの区切り文字
@exit /b 9
@rem ---------------------------
@rem */
@end
(function outHereDoc(file, tag){
var sr = (WScript.CreateObject("Scripting.FileSystemObject")).OpenTextFile(file, 1, false);
var outFlg = false;
while(!sr.AtEndOfStream){
var s = sr.ReadLine();
if(s==("<" + tag)) outFlg = false;
//if(outFlg) WScript.Echo(s);
if(outFlg) WScript.StdOut.WriteLine(s);
if(s==(tag + ">")) outFlg = true;
}
sr.Close();
delete sr;
})(WScript.Arguments(0), WScript.Arguments(1));
view raw NearDoc.bat hosted with ❤ by GitHub

[NearDocTest.bat] ※テストコード

@echo off
cd /d "%~dp0"
rem コンソールの文字コードをUTF-8に変更。
rem GitHubに上げると文字コードがUTF-8に変わってしまうので。。。
rem ちゃんとShift-JISで検証する場合、このコマンドは不要。
chcp 65001
rem ---------------------------
rem simple test
rem ---------------------------
echo テスト①
Call NearDoc.bat "%~0" HERE1
echo.
echo テスト②
Call NearDoc.bat "%~0" HERE2 | sort
echo.
echo テスト終了
pause
GOTO :EOF
HERE1>
1 2 3
4 5 6
7 8 9
<HERE1
HERE2>
anjr
56
osdsdpo
3
4
5
7
1
<HERE2
view raw NearDocTest.bat hosted with ❤ by GitHub