我有一个脚本,它遍历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()