Вы получаете это, потому что $PJ
- это $null
. NextJob
ничего не возвращает.
Чтобы защититься от этого, WaitForJob(int)
возвращает логическое значение, $true
, если работа пришла, и $false
, если нет, поэтому вы должны знать, когда WaitForJob
завершится есть ли работа для получения или нет:
if( $PDFCreator.WaitForJob(5) ){
$PJ = $PDFCreator.NextJob
$PJ.allowDefaultPrinterSwitch('C:\Users\userName\Downloads\SampleACORD.txt', $true)
$PJ.ConvertTo($TXT)
} else {
# Handle the no jobs case here
}
Вы также можете сделать нулевую проверку против $PJ
, прежде чем пытаться позвонить $PJ.allowDefaultPrinterSwitch
:
if( $PJ ){
$PJ.allowDefaultPrinterSwitch('C:\Users\userName\Downloads\SampleACORD.txt', $true)
$PJ.ConvertTo($TXT)
}
Вот некоторые дополнительная информация об API PDFCreator.JobQueue
, которая может оказаться вам полезной.
Для решения вашей проблемы в комментариях, где файл не создается, это Страница документации объясняет логический ход процесса конвертации:
- Вызовите метод
Initialize()
с вашим COM-объектом. - Вызов
WaitForJob(timeOut)
, если вы ожидаете, что одно задание на печать попадет в очередь. Параметр timeOut
указывает максимальное время, в течение которого очередь ожидает поступления задания на печать. - Теперь вы можете получить следующее задание в очереди, вызвав свойство
NextJob
. - Запустите преобразование в задании печати с помощью
ConvertTo(path)
. Параметр path включает полный путь к папке, в которой должен быть сохранен преобразованный файл, и его полное имя. - Свойство
IsFinished
сообщает о состоянии преобразования. Если задание на печать выполнено, IsFinished
возвращает значение true. - Если вы хотите узнать, было ли задание выполнено успешно, рассмотрите свойство
IsSuccessful
. Он возвращает true, если задание было успешно преобразовано, иначе false.
В вашем случае я не уверен, насколько важен профиль, но похоже, что ваш код не ждет для завершения. Следующий код будет ожидать завершения задания преобразования до sh (и при необходимости проверить его на успешность):
# Wait for completion
while( -Not $PJ.IsFinished ){
Start-Sleep -Seconds 5
}
# Check for success
if( $PJ.IsSuccessful ){
# success case
} else {
# failure case
}
Не имеет значения, но рекомендуется использовать код в try/finally
и поместите ваш COM-релиз в этот блок. Таким образом, ваше COM-соединение закрывается чисто даже в случае завершающей ошибки:
$PDFCreator = New-Object -ComObject PDFCreator.JobQueue
try {
# Handle PDF creator calls
} finally {
if( $PDFCreator ){
$PDFCreator.ReleaseCom()
}
}
Блок finally
гарантированно будет выполнен перед возвратом в родительскую область, поэтому, если код завершится успешно или не удастся, finally
блок будет запущен.