PowerShellコードを自動インデント・整形するスクリプト

PowerShellのインデントが崩れてしまうことがあります。自動インデントをできるツールを探していたのですが、基になるスクリプト見つけたので、結局それを元に自分で関数作りました。(本当は標準のISEとかで実装されていると嬉しいのですが。。。)

作ってみた関数はこれです。

function Get-FormattedCode
{
	param($FilePath,$IndentLength = 4)
	$space = ' '
	$indent = 0
	$src = switch -regex -file $FilePath {
		  '{\s*$'   {  ($space * $IndentLength) * $indent++ + $_.Trim(); continue;}
		  '^\s*}'   { ($space * $IndentLength) * --$indent + $_.Trim(); continue;}
		  '^\s*$'   { "" ; continue;}
		  '[^{}]'   { ($space * $IndentLength) * $indent + $_.Trim(); continue;}
	}
	return $src
}

 
 
このように使います。
「-FilePath」には元のPowerShellスクリプトを指定します。
「-IndentLength」はインデントの大きさです。デフォルトは4(半角4文字)です。

Get-FormattedCode  -FilePath ".\myscript.ps1" -IndentLength 5 | Out-File ".\out.ps1"

 

元のファイル(例だとmyscript.ps1)が以下のインデントバラバラのスクリプトだとすると、

   $message = "START"

try{
if($message){
Write-Host "OK"
			}else
{
Write-Host "Error"
		}
  }
catch
  {
Write-Host "Error"
}
finally
     {
Write-Host "Finish"
}


自動インデントされたファイル(例だとout.ps1)は以下のようになります。

$message = "START"

try{
     if($message){
          Write-Host "OK"
     }else
     {
          Write-Host "Error"
     }
}
catch
{
     Write-Host "Error"
}
finally
{
     Write-Host "Finish"
}

 
 


関数の使うのが面倒な人は以下の一行をPowerShellプロンプトに打ち込んで、

$CodeFormatter = {param($FilePath,$IndentLength = 4);$space=' ';$indent=0;$src=switch -regex -file $FilePath {'{\s*$'{($space * $IndentLength) * $indent++ + $_.Trim();continue;}'^\s*}'{($space * $IndentLength) * --$indent + $_.Trim();continue;}'^\s*$'{"";continue;}'[^{}]'{ ($space * $IndentLength) * $indent + $_.Trim(); continue;}}return $src}

このように実行すれば同じことが可能です。

PS>$CodeFormatter.Invoke("C:\script\myscript.ps1") | Out-File ".\newscript.ps1"

参考URL

このスクリプトはここで書かれていたものをヒントにして作りました。
http://stackoverflow.com/questions/5807943/powershell-code-tidy-or-reformat