Word COM 对象循环 - 随时间推移出错



我有一个脚本,它遍历CSV文件列表,每个文件有100个条目。基本上,它根据该行中的数据创建一个word文档,这是循环的开始:

while ( ( Get-Childitem "\rspldataQMSOwainDatabase-Anon-ResumesDataFiles-new").count -ne 0 ) {
    [int]$hour = get-date -format HH
    If ( $hour -gt 6 -and $hour -lt 6 ) {
        Start-Sleep -s 1800100}
    else {
        foreach ( $file in ( Get-Childitem "\rspldataQMSOwainDatabase-Anon-ResumesDataFiles-new" ) ) {
            # Connect Word
            $objWord = New-Object -comobject Word.Application
            $objWord.Visible = $false 
            $templatedir = "\rspldataQMSOwainDatabase-Anon-ResumesTemplatesResumesOut"
            $templateDir = Get-ChildItem ("\rspldataQMSOwainDatabase-Anon-ResumesTemplatesResumesOut") | Get-Random -Count 1 
            $templateFile = $templateDir
            $templateDir =  ("\rspldataQMSOwainDatabase-Anon-ResumesTemplatesResumesOut" + $templateDir)
            if (!(checkLock $file.fullname) -and (Test-Path $file.FullName) ) {
                $cand_CSV = Import-CSV $file.fullname
                $LockFile = [System.io.File]::Open("$($file.fullname)", 'Open', 'Read','None')
                Write-Host "[+] Processing file $($file.fullname)" -foregroundcolor GREEN
                foreach ( $line in $cand_CSV ) {

这是结束:

                }
                $LockFile.Close()
                Remove-Item $file.fullname -force
            }
            else {
                Write-Host "$($file.fullname) :: locked - continuing"
            }
            $null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$objWord)
            [gc]::Collect()
            [gc]::WaitForPendingFinalizers()
            Remove-Variable objWord 
        }
    }
}

foreach 循环的其余部分只是将数据添加到 Word 中的书签中。

基本上,我正在尝试创建大约 1,000,000 个恶搞简历,这在一台 PC 上花费的时间太长,所以我希望能够在几台 PC 上运行它并离开它,问题是,在昨晚的测试运行后,我注意到大约有 150 个 WINWORD.EXE 进程打开,计算机必须重新启动。

另一台 PC 打开了一个保存框,阻止了脚本继续。

以下内容不应该关闭 Word 进程吗?

$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$objWord)
            [gc]::Collect()
            [gc]::WaitForPendingFinalizers()
            Remove-Variable objWord 

停止关闭 Word 并重新启动它!将创建 Word comobject 的部分移动到循环之前。关闭文档,但不关闭 Word。循环完成后,关闭 Word 并销毁 comobject。

# Connect Word
$objWord = New-Object -comobject Word.Application
$objWord.Visible = $false 
$templateRootDir = "\rspldataQMSOwainDatabase-Anon-ResumesTemplatesResumesOut"
while ( ( Get-Childitem "\rspldataQMSOwainDatabase-Anon-ResumesDataFiles-new").count -ne 0 ) {
    [int]$hour = get-date -format HH
    If ( $hour -gt 6 -and $hour -lt 6 ) { # Will NEVER happen. $hour can not be both greater than, and also less than 6.
        Start-Sleep -s 1800100}
    else {
        foreach ( $file in ( Get-Childitem "\rspldataQMSOwainDatabase-Anon-ResumesDataFiles-new" ) ) {
            $templateFile = Get-ChildItem $templateRootDir | Get-Random -Count 1
            $templateDir =  $templateFile.FullName
            if (!(checkLock $file.fullname) -and (Test-Path $file.FullName) ) {
                $cand_CSV = Import-CSV $file.fullname
                $LockFile = [System.io.File]::Open("$($file.fullname)", 'Open', 'Read','None')
                Write-Host "[+] Processing file $($file.fullname)" -foregroundcolor GREEN
                foreach ( $line in $cand_CSV ) {
                    $docResume = $objWord.Documents.add($templateDir)
                    <more code>
                    $docResume.Save()
                    $docResume.Close($false)
                }
                $LockFile.Close()
                Remove-Item $file.fullname -force
            }
            else {
                Write-Host "$($file.fullname) :: locked - continuing"
            }
        }
    }
}
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$objWord)
[gc]::Collect()
[gc]::WaitForPendingFinalizers()
Remove-Variable objWord 

另外,请在您第一次If声明后查看我的评论。

我不相信删除PowerShell变量足以摆脱Word实例。 您必须明确告知 Word 退出:

$objWord.quit()

最新更新