※はてブより引っ越しました。
powershellでExcelを操作して正常に処理が終了しても、タスクマネージャーにいつまでも「Excel.exe」が残ってしまうことがあるんですよね。
そうすると最悪Excelが開かなくなることも。
そこでExcelオブジェクトの開放についてやってみました!
powershellでのExcelオブジェクトの操作方法
powershellではexcelを簡単に操作することができます。
簡単に使い方を説明すると
#excelオブジェクトを開く $excel = New-Object -ComObject Excel.Application #excel非表示 $excel.Visible = $false #ブックを開く $excelFile = $excel.Workbooks.Open("ファイルパス") # Excelのシート $sheet = $excel.Worksheets.Item("シート名またはシート番号") #セルに値を編集 $cell= $sheet.Cells.Item(1,1) = "10" #ブックを閉じる $excelFile.Close() #excelを閉じる $excel.Quit()
※$excel.Visibleをfalseにしないと処理中にExcelが立ち上がる。
みたいな感じで使用できます。
powershellでexcelを操作する記事はたくさんあので、興味がある方は検索してみてくださいね。
処理終了時に残るExcelのプロセスを解放する
ここで問題なのは$excel.Quit()でexcelを閉じたにも関わらず。
タスクマネージャーを確認すると「excelのプロセスが残ってしまう」ことです。
「nullを代入する」
とか
「ガベージコレクションを最後に呼ぶ」
とかいろいろ試した結果
#excelのオブジェクトを解放 [void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($excel)
でプロセスを開放することができました!
先ほどのソースに追加すると
#excelオブジェクトを開く $excel = New-Object -ComObject Excel.Application #excel非表示 $excel.Visible = $false #ブックを開く $excelFile = $excel.Workbooks.Open("ファイルパス") # Excelのシート $sheet = $excel.Worksheets.Item("シート名またはシート番号") #セルに値を編集 $cell= $sheet.Cells.Item(1,1) = "10" #ブックを閉じる $excelFile.Close() #excelを閉じる $excel.Quit() #ここの行を追加 #comオブジェクトを開放 [void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($sheet) [void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($excel)
となります。
[void]にしなくてもいいですが、こうするとコンソールで処理結果を確認することができます。コンソールに’1’とか表示される。
voidにしなくてもとくに処理には影響ないです。
powershellは開放する順番は関係なく開放してくれますが、.Netだとcomオブジェクトの開放に順番があるので注意!
excelでいうと 「セル → シート → excelオブジェクト 」の順番でないとプロセスが残ってしまいうんですよね。
powershellの曖昧なとこいいよね!!!
また「プロセスの開放」に時間がかかることがあるので、処理終了後にタスクマネージャーで「Excel.exe」をしばらく見てあげてください。
残っていても少し経ったら消えるはずです!
下記サイト参考にさせていただきました。ありがとうございます!
mtgpowershell.blogspot.jp
まとめ
処理終了時に残ることがあるExcelオブジェクトを解放することができました。
.Netの場合は開放する順番があるので要注意!