mtb*_*434 3 excel powershell excel-2013 windows-10
无论我尝试什么,Excel 2013都会继续在Windows 10的后台运行,无论我在PowerShell脚本末尾抛出什么命令.我已经尝试将我发现的所有建议添加到我的脚本末尾,并且我打开的唯一Excel对象仍然保持打开状态.这是我脚本末尾的内容.还有其他建议吗?
## Quit Excel and Terminate Excel Application process:
$xlsxwb.quit
$xlsxobj.Quit
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xlsxobj)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xlsxwb)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xlsxSh1)
Start-Sleep 1
'Excel processes: {0}' -f @(Get-Process excel -ea 0).Count
Run Code Online (Sandbox Code Playgroud)
小智 9
我遇到了同样的问题并尝试了各种解决方案而没有成功.当我开始发布我保存为变量的所有COM对象时,我离得更近了,而不仅仅是工作簿,工作表和Excel应用程序.
例如,采用以下示例代码:
$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $False
$Workbook = $Excel.Workbooks.Open("C:\Temp\test.xlsx")
$Worksheet = $Workbook.Worksheets.Item(1)
$UsedRange = $Worksheet.UsedRange
$Range = $Worksheet.Range("A1:B10")
$Workbook.Close()
$Excel.Quit()
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($Range)
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($UsedRange)
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($Worksheet)
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($Workbook)
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)
[GC]::Collect()
Run Code Online (Sandbox Code Playgroud)
如果您只取出一个ReleaseComObject语句,Excel进程将保持打开状态.在我的代码中,我首先发布范围,表格等所有内容,然后我执行工作表,工作簿,最后是Excel应用程序本身.然后,因为它似乎只有90%的时间工作,我在最后添加了垃圾收集命令,最后有一个似乎每次都可以工作的解决方案,而不必杀死进程.
注意:我的系统是带有PowerShell v5和Office 2013的Windows 8.1.
下面是一个简单的例子。对于更复杂的过程,可能需要一些额外的代码。
function _FullQuit {
while ( $this.Workbooks.Count -gt 0 ) {
$this.Workbooks.Item(1).Close()
}
$this.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($this)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
function New-Excel {
$object = New-Object -ComObject "Excel.Application"
$object | Add-Member -MemberType ScriptMethod -Name FullQuit -Value {_FullQuit}
$object
}
$xl = New-Excel
$wb1 = $xl.Workbooks.Open("C:\Data1.csv")
$wb2 = $xl.Workbooks.Open("C:\Data2.csv")
$xl.FullQuit()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7691 次 |
| 最近记录: |