kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

今日のスクリプト(BASE64をデコードする)

function DecodeBase64($inFile, $outFile)
{
    [Void][Reflection.Assembly]::LoadWithPartialName("System.IO")
    $DecodeFile = new-object System.IO.FileStream ($outFile, [System.IO.FileMode]::Create)
    $Base64File = new-object System.IO.StreamReader $inFile
    while($Base64File.Peek() -ge 0)
    {
        $LineBuf = $Base64File.ReadLine()
        [byte[]] $ByteBuf = [Convert]::FromBase64String($LineBuf)
        $DecodeFile.Write($ByteBuf, 0, $ByteBuf.Length)
    }
    $DecodeFile.Close()
    $Base64File.Close()
}

Thunderbirdが分割メールをサポートしていないので、いちいち保存して連結してMIMEデコードしなきゃならない。結合する拡張機能もあるんだけれど、今日受け取ったメールではうまく動いてくれませんでした。ところがこのFunctionを動かすとこんな例外が。

New-Object : "2" 個の引数を指定して ".ctor" を呼び出し中に例外が発生しました: "パス名を空にすることはできません。"
発生場所 行:4 文字:29
$DecodeFile = new-object <<<< System.IO.FileStream ($outFile, [System.IO.FileMode]::Create)

例外は出るものの、ちゃんと動くんですよね(?-?)。ちなみにC#のusingに慣れ切っていたので、最初のバージョンではClose()を呼び忘れてしまい、「あれなんでこれ消せないんだろう?」と3.14159276秒ほど悩んだのでした。当然ですが、Powershellのホストがつかみっぱになっています。対象のオブジェクトを解放(別のオブジェクトで代入してやるとか)してやれば消せます。