使用 PowerShell 脚本,我打开特定路径中的所有 .docx 文件并更新每个文档的目录 - 所有操作均按步骤执行(ForEach
)。
更新任何文档的目录后,将保存更新的文档,然后关闭,最后一步是再次退出 Word 应用程序。
Word 窗口($word.Visible = $true
)立即关闭,但是 WINWORD.EXE 进程仍然处于活动状态(在任务管理器中可见)约 3 到 5 分钟。
有人能解释一下为什么会这样吗?我预计这$word.Quit()
也会立即结束 WINWORD.EXE 进程。
有什么技巧可以立即结束 WINWORD.EXE 吗?该脚本使用 Windows Server 2016 上的 Windows 任务计划程序执行。
我的代码的相关部分:
$FileList = Get-ChildItem -Path C:\ExportedDocuments -File -Filter "*.docx"
ForEach ($DocFile in $FileList) {
$DocFileName = $DocFile.Name.split(".")[0]
Write-Log -Message "The document: $DocFileName is being processed" -Path $LogFile -Level Info
$word = New-Object -ComObject Word.Application
$word.Visible = $true
$doc = $word.Documents.Open($DocFile.FullName)
$toc = $doc.TablesOfContents
$toc.item(1).update()
$doc.save()
$doc.close()
Remove-Variable toc
Remove-Variable doc
Write-Log -Message "Before word.Quit()" -Path $LogFile -Level Info
# CleanUp
$word.Quit()
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$word)
[gc]::Collect()
[gc]::WaitForPendingFinalizers()
Remove-Variable word
Write-Log -Message "After word.Quit()" -Path $LogFile -Level Info
}
日志写入的相关部分:
2020-06-17 11:09:10 INFO: Before word.Quit()
2020-06-17 11:13:27 INFO: After word.Quit()
作为加快关闭进程的第一个解决方案,我在脚本中嵌入了以下内容:$word.quit()
$ProcessActive = Get-Process WINWORD -ErrorAction SilentlyContinue
if($ProcessActive -eq $null)
{
Write-Log -Message "WINWORD process was already closed" -Path $LogFile -Level Info
}
else
{
Stop-Process -processname "WINWORD"
Write-Log -Message "WINWORD was still running and has been stopped by the script" -Path $LogFile -Level Info
}