C# のスリー・スラッシュ・コメントのドキュメント化
Cs-To-Doc コマンドレット
# ■概要
#  C# のスリー・スラッシュ・コメントをドキュメント化。
#
#  ドキュメントはタブ区切り文字列です。
#
# ■使い方
#  C# のソースコードをクリップボードにコピーして本コマンドレッドを実行。
#  実行結果はクリップボードに出力(コピー)。
#
#  public のメソッドとフィールドがドキュメント化の対象です。
#   ※ メソッドとフィールドは区別していないため、フィールドに対しても
#    引数と戻り値の欄を設けます。
#   ※ メソッドが複数行で記述している場合には対応していません。
#
# ■例
#
#  入力)
#
#       /// <summary>
#       /// 初期化
#       /// </summary>
#       /// <param name="strAppName">アプリ名</param>
#       /// <param name="nScreenW">画面の横サイズ</param>
#       /// <param name="nScreenH">画面の縦サイズ</param>
#       /// <returns>実行結果。
#       /// 正常時は true 、失敗時は false を返す。
#       /// </returns>
#       public bool Init( string strAppName, int nScreenW, int nScreenH )
#       {
#           // ... 処理内容省略 ...
#
#           // 初期化成功
#           return true;
#       }
#
#       /// <summary>
#       /// クリア
#       /// </summary>
#       public void Clear()
#       {
#           // ... 処理内容省略 ...
#       }
#
#  出力)`t = タブ文字、`n = 改行
#
#       概要`t"初期化"`n
#       public bool Init( string strAppName, int nScreenW, int nScreenH )`n
#       引数`tstrAppName`t"アプリ名"`n
#       `tnScreenW`t"画面の横サイズ"`n
#       `tnScreenH`t"画面の縦サイズ"`n
#       戻り値`t"実行結果。`n正常時は true 、失敗時は false を返す。"`n
#       概要`t"クリア"`n
#       public void Clear()
#       引数`tなし`n
#       戻り値`tなし`n
#
#
    trap
    {
        break
    }
Function Output-Doc
{
    Param( $wk )
    # 各文字列を改行区切りで結合
    $str = $wk.lines -join "`n"
    # タグ直後の改行を除く
    $str = $str -replace '>\n+', '>'
    # タグ直前の改行を除く
    $str = $str -replace '\n+<', '<'
    #### XML へ変換
    $xml = [xml] ('<xml>' + $str + '</xml>')
    #### 概要
    "概要`t`"{0}`"" -f $xml.GetElementsByTagName('summary').InnerText
    #### メソッド
    $wk.method
    #### 引数
    $params = $xml.GetElementsByTagName('param')
    if( $params.Count -eq 0 )
    {
        "引数`t{0}" -f 'なし'
    }
    else
    {
        $title = '引数'
        $em = $params.GetEnumerator()
        while( $em.MoveNext() )
        {
            "{0}`t{1}`t`"{2}`"" -f $title ,$em.Current.GetAttribute('name') ,$em.Current.InnerText
            $title = ''
        }
    }
    #### 戻り値
    $returns = $xml.GetElementsByTagName('returns')
    if( $returns.Count -eq 0 )
    {
        "戻り値`t{0}" -f 'なし'
    }
    else
    {
        "戻り値`t`"{0}`"" -f $returns.InnerText
    }
}
Function Parse-Comment
{
    Param( $lines )
    Begin
    {
        $X_PROCESS_START = 0
        $X_PROCESS_COMMENT = 1
        $nProcessId = $X_PROCESS_START
        $rgComment = [System.Text.RegularExpressions.Regex]::new( '^[\t ]*///[\t ]*(.*)$' );
        $rgEndComment = [System.Text.RegularExpressions.Regex]::new( '^[\t ]*public[\t ]+(.*)$' );
        $wk = @{
            lineIndex = 0;
            lineCounter = 0;
            beginIndex = -1;
            endIndex   = -1;
            lines = New-Object 'System.Collections.ArrayList'
            method = ''
        }
        $wk.Clear = {
            $wk.lines.Clear()
            $wk.method = ''
        }.GetNewClosure()
    }
    Process
    {
        $wk.lineIndex = $wk.lineCounter ++
        $line = $_
        $bLoop = $False
        do
        {
            switch( $nProcessId )
            {
                $X_PROCESS_START
                {
                    $m = $rgComment.Match( $line )
                    if( $m.Success )
                    {
                        $wk.beginIndex = $wk.lineIndex
                        [void] $wk.lines.Add( $m.Groups[1].Value )
                        $nProcessId = $X_PROCESS_COMMENT
                    }
                }
                $X_PROCESS_COMMENT
                {
                    $m = $rgEndComment.Match( $line )
                    if( $m.Success )
                    {
                        $wk.endIndex = $wk.lineIndex
                        $wk.method = $m.Groups[1].Value
                        Output-Doc $wk
                        & $wk.Clear
                        $nProcessId = $X_PROCESS_START
                        break
                    }
                    $m = $rgComment.Match( $line )
                    if( $m.Success )
                    {
                        [void] $wk.lines.Add( $m.Groups[1].Value )
                        break
                    }
                    & $wk.Clear
                    $nProcessId = $X_PROCESS_START
                }
            }
        }while( $bLoop )
    }
}
    $lines = Get-Clipboard
    $lines | Parse-Comment $lines | Set-Clipboard