【BAT】BATファイルでヒアドキュメントを実現するBAT
概要
BATファイルでヒアドキュメントっぽいことを実現します。
これを使えばいろいろと便利になりそうです。※実装には、やんごとなき理由でJScriptを使用しています。
(DOS-BAT の for /f で回すと、空行が間引かれてしまうというアレの所為)
使い方
BATファイル内の、到達できない場所(exitやgoto :eofの後ろなど)にヒアドキュメントっぽいもの(ニアドキュメント)を記述します。
ニアドキュメントの範囲は、任意の文字に「>」(始端)と「<」(終端)を付与し指定します。
|
|
実際に出力する際は、「NearDoc.bat」をCallし、
- 第一引数 … 自BATのパス
- 第二引数 … ヒアドキュメントの区切り文字
|
|
標準出力に、「HERE>」~「<HERE」の間に記述されている内容が出力されます。
|
|
標準出力に出るので、パイプで繋いでsortやらfindstrやらでごにょごにょできます。
また、区切り文字さえ被らなければ、ニアドキュメントは複数記述可能です。
(テストコードでも複数を使用しています)
ソースコード
いつもと同様、上が話題のコードで、下が簡単なテストコードです。[NearDoc.bat]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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)); |
[NearDocTest.bat] ※テストコード
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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 |