2010年4月7日水曜日

Windows Power Shellで、ソースの余白を削除するコマンドを作る





他人のプログラムソースを修正したり、自分の過去のソースに手を加えたりする時、右側の余白がボコボコあったりすると気になるものです。
そこで、Windows Power Shellにて、ソースの右側の余白を削除するコマンドを作ってみました。

余白を削りたいソースをフルパスで指定すると、同一ディレクトリに、自動で新ソース名を決めて余白を削ったファイルを作ってしまうコマンドです。

この手のツールって、今までのWindowsだと、まずどの処理系で作るのか悩むところでしたが、Windows 7であれば、Windows Power Shellがあるから悩まなくて良いのが嬉しい。

何かツールが欲しいなと思ったら、簡単に、手軽にポンと作ってしまえるのが、Windows Power Shellの大きなメリットですねー。

(修正)
すみません。新ファイル名ですが、「秒」の部分が大文字のSSになってますね。これは、プログラムの「yyyyMMdd_HHmmSS_ff」のSS部分を小文字のssにすると秒になります。


■ソース(インデント消えてますがご容赦下さい)■

#--------------------------------------
#ソースの余白削除
#--------------------------------------
function global:TrimSource(
[string]$p_path="",
[string]$p_encoding = "Shift_JIS"
)
{
#----------------------------
#変数定義
#----------------------------
[IO.StreamReader]$obj_R = $null; #ソース読み取り用
[IO.StreamWriter]$obj_W = $null; #新ソース書き出し用
[Text.Encoding]$enc_this= $null; #文字コード
[string]$str_newfilename= ""; #新ファイル名

#----------------------------
#変数定義
#----------------------------
try
{
if(!(Test-Path $p_path))
{
throw "ファイルが存在しません。";
}
#新ファイル名を求める
$str_newfilename = CreateNewFileName($p_path);
#文字コード定義
$enc_this = [Text.Encoding]::GetEncoding($p_encoding);
#ソース読み取りオープン
$obj_R = $(New-Object IO.StreamReader($p_path,$enc_this));
#新ソースを書き込みオープン
$obj_W = $(New-Object IO.StreamWriter($str_newfilename,$false,$enc_this));

#@@@@@@@@@@[LOOP-START]@@@@@@@@@@
while(!($obj_R.EndOfStream))
{ #読み込んだ片っ端からソースの余白を削除して書き出し
$obj_W.WriteLine($obj_R.ReadLine().TrimEnd());
}
#@@@@@@@@@@[LOOP-END ]@@@@@@@@@@

}
catch [Exception]
{
Write-Output $Error[0].ToString();
}
finally
{
if(!([String]::IsNullOrEmpty($obj_R)))
{
$obj_R.Close();
$obj_R.Dispose();
}
if(!([String]::IsNullOrEmpty($obj_W)))
{
$obj_W.Close();
$obj_W.Dispose();
}
}
}

#--------------------------------------
#新ファイル名 作成処理
#--------------------------------------
function global:CreateNewFileName(
[string]$p_filename=""
)
{
#----------------------------
#変数定義
#----------------------------
[IO.FileInfo]$obj_fi = (Get-Location).Path; #ファイル情報
[string]$str_path = ""; #パス
[string]$str_name = ""; #現ファイル名
[string]$str_new_name = ""; #新ファイル名
[string]$str_ext = ""; #拡張子
[string]$str_result = ""; #結果格納エリア
#----------------------------
#処理
#----------------------------

try
{
$obj_fi = $p_filename; #ファイル情報セット
$str_path = $obj_fi.get_DirectoryName(); #パスの取得
$str_ext = $obj_fi.get_Extension(); #拡張子の取得
$str_name = $obj_fi.get_Name(); #現ファイル名取得
#新ファイル名
$str_new_name = $str_name.replace($str_ext,"") +
([DateTime]::Now).ToString("
_yyyyMMdd_HHmmss_ff") +
$str_ext;
#最初は秒の部分が大文字になってました。
$str_result = Join-Path $str_path $str_new_name;

}
catch [Exception]
{
$str_result = "";
}
return $str_result;

}