Если вы уверены, что учетная запись службы имеет доступ к Word, я думаю, что исключение, с которым вы сталкиваетесь, - [ref]
при выполнении SaveAs (). AKAIK только для версий Office ниже 2010 года требуется [ref]
, для версий выше - нет.
Далее, я думаю, что ваш код может быть несколько изменен, например, путем освобождения объектов com ($ Do c и $ Word) внутри блока finally
, поскольку это всегда выполняется. Кроме того, нет необходимости выполнять Get-ChildItem
дважды.
Примерно так:
$SuccessPath = 'D:\PROCESSOR\Success'
$FileSource = 'D:\PROCESSOR\NewArrivals'
$filesProcessed = 0
try {
$Word = New-Object -ComObject Word.Application
$Word.Visible = $false
# get a list of FileInfo objects that have the .doc extension and loop through
Get-ChildItem -Path $FileSource -Filter '*.doc' -File | ForEach-Object {
# change the extension to pdf for the output file
$pdf = [System.IO.Path]::ChangeExtension($_.FullName, '.pdf')
$Doc = $Word.Documents.Open($_.FullName)
# Check Version of Office Installed. Pre 2010 versions need the [ref]
if ($word.Version -gt '14.0') {
$Doc.SaveAs($pdf, 17)
}
else {
$Doc.SaveAs([ref]$pdf,[ref]17)
}
$Doc.Close($false)
$filesProcessed++
}
}
finally {
# cleanup code
if ($Word) {
$Word.Quit()
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($Doc)
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($Word)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
$Word = $null
}
}
Тогда возникает вопрос $SuccessPath
. Вы никогда не используете это. Вы хотите сохранить PDF-файлы по этому пути? Если это так, измените строку
$pdf = [System.IO.Path]::ChangeExtension($_.FullName, '.pdf')
на
$pdf = Join-Path -Path $SuccessPath -ChildPath ([System.IO.Path]::ChangeExtension($_.Name, '.pdf'))
Надеюсь, что это поможет