对上述 Com 操作进行搜索会产生可追溯到 09 年甚至更早的链接。也许它没有改变,但我发现自己遇到了“它被另一个进程使用”的错误。 - 即使我的桌面上没有打开 Excel 应用程序。我必须重新启动才能恢复。明确地说 - 我正在尝试打开一个现有文件;立即 SaveAs()(那么多工作),添加一张表,Save(); Close() - 然后,重要的是,重复该循环。实际上,我在执行上述“Open Master;”的循环中创建了几十个新工作表; SaveAs() ;编辑东西;保存;关闭;从我看到的示例中,这不是 PowerShell 的典型工作流程。粘贴在最底部的是我的临时脚本 - 非常粗糙和不完整,但事情正在打开他们需要打开的内容并且添加工作表也有效 - 直到我知道我有正确的方法来干净地关闭东西我不担心迭代.我发现了几个解决关闭问题的例子: From http://theolddogscriptingblog.wordpress.com/2012/06/07/get-rid-of-the-excel-com-object-once-and-for-all/$x = New-Object -com Excel.Application$x.Visible = $TrueStart-Sleep 5$x.Quit()[System.Runtime.Interopservices.Marshal]::ReleaseComObject($x)Remove-Variable x And from http://social.technet.microsoft.com/Forums/windowsserver/en-US/24e57b61-e792-40c1-8aff-b0a8205f48ab/updated-opened-excel-using-powershell?forum=winserverpowershellSet-ItemProperty $path -name IsReadOnly -value $false$Excel.ActiveWorkBook.Save()$openfile.Close()$openfile = $null$Excel.Quit()$Excel = $null[GC]::Collect()function MakeNewBook($theWeek, $AffID){ $ExcelFile = "C:\csv\InvoiceTemplate.xlsm" $Excel = New-Object -Com Excel.Application $Excel.Visible = $True $Workbook = $Excel.Workbooks.Open($ExcelFile) $theWeek = $theWeek -replace "C:\\csv\\", "" $theWeek = $theWeek -replace "\.csv", "" $theWeek = "c:\csv\Invoices\" +$AffID +"_" + $theWeek + ".xlsm" $SummaryWorksheet = $Workbook.worksheets.Item(1) $Workbook.SaveAs($theWeek) return $Excel}function MakeNewSheet($myBook, $ClassID){ $SheetName = "w"+$ClassID #$Excel = New-Object -Com Excel.Application #$Excel.Visible = $True $wSheet = $myBook.WorkSheets.Add()}function SaveSheet ($myExcel){ #$WorkBook.EntireColumn.AutoFit() #Set-ItemProperty $path -name IsReadOnly -value $false $myExcel.ActiveWorkBook.Save() $openfile= $myExcel.ActiveWorkBook $openfile.Close() $openfile = $null $myExcel.Quit() $myExcel = $null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($myExcel) Remove-Variable $myExcel [GC]::Collect()}$theWeek = "C:\csv\wkStart2013-11-04.csv"$x = Import-Csv $theWeekforeach ($xLine in $x){ if ($x[0]){ $AffID = $x[1].idAffiliate $myExcel = MakeNewBook $theWeek $x[1].idAffiliate $ClassID = $x[1].idClass MakeNewSheet $myExcel $ClassID continue } SaveSheet($myExcel) $AffID = $_.$AffID $wID = $xLine.idClass #MakeNewSheet($wID) Echo "$wID"} 最佳答案 我的经验是 Quit 方法效果不佳,尤其是在循环时。当您收到错误消息时,不要重新启动,而是打开任务管理器并查看进程选项卡。我敢打赌你会看到 Excel 仍然打开——甚至可能是它的多个实例。我通过使用 Get-Process 查找 Excel 的所有实例并将它们传送到 Stop-Process 解决了这个问题。似乎没有必要这样做,但它对我有用。关于powershell - 如何打开;另存为;然后从 PowerShell4 关闭 Excel 2013(启用宏)工作簿,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19908302/
10-16 05:07