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のホストがつかみっぱになっています。対象のオブジェクトを解放(別のオブジェクトで代入してやるとか)してやれば消せます。