Reputation: 978
I am initiating a macro in a workbook from powershell (to automate a process). The below in powershell opens the excel workbook and runs the macro without visualizing the process.
The issue is even though I do not see the macro running, the new instance of excel generated from the macro is still open.
# start Excel
$excel = New-Object -comobject Excel.Application
#open file
$FilePath = 'C:\file\Book1.xlsm'
$workbook = $excel.Workbooks.Open($FilePath)
#access the Application object and run a macro
$app = $excel.Application
$app.Run("macro")
#close excel
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
Start-Sleep 1
'Excel processes: {0}' -f @(Get-Process excel -ea 0).Count
Remove-Variable $excel
exit $LASTEXITCODE
The excel file still comes up as a process in task manager and is taking up memory space.
How do I have powershell completely close the instance of the excel application that opens through the macro?
Any help greatly appreciated!
Upvotes: 7
Views: 35306
Reputation: 289
Creating the Excel file:
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $True
...
Closing down the Excel file:
$Excel.Close()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)
spps -n Excel
Upvotes: 3
Reputation: 3226
Try using Quit method before you release COM object, like this:
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
Remove-Variable excel
Upvotes: 8
Reputation: 186
You could add this to your PS code:
kill -processname excel
This will close all open instances of Excel
Upvotes: 4