Скрипт PowerShell с Word Interop, как предотвратить открытие диалогового окна восстановления? - PullRequest
0 голосов
/ 09 декабря 2011

Я использую сценарий PowerShell для пакетного преобразования документа Word в PDF-файлы.

Часть сценария преобразования (при необходимости я могу вставить весь сценарий):

$word = New-Object -ComObject "word.application"

$outputFile = $outputDirectory + "\" + "myPdf.pdf" 

$doc = $word.documents.Open($inputFile, $refFalse,  $true) # open in background - No UI
$doc.SaveAs([ref]$outputFile, [ref]17) #17 is for PDF
$doc.Saved = $true
write-host "Processed $outputFile" -foregroundcolor Green 
$doc.Close()
$word.Quit()

Сценарий работает довольно хорошо, но некоторые из исходных документов повреждены.Когда Word обнаруживает один из этих документов, он отображает диалоговое окно восстановления.Это приводит к тому, что мой сценарий блокируется, пока пользователь не закроет диалоговое окно.

Как я могу предотвратить это диалоговое окно?

[Редактировать] Вот скриншот этого диалогового окна

Show Repairs dialog

Ответы [ 5 ]

1 голос
/ 12 декабря 2011

Я просто смотрел в неправильном направлении.

Нет параметра Open , позволяющего отключить этот диалог, но я обнаружил, что есть другой метод: OpenNoRepairDialog .

Просто ... просто нужно немного осмотреться

1 голос
/ 10 декабря 2011

Я думаю, что Christian может работать, если вы установите для параметра DisplayAlerts значение $ false.

Попробуйте следующее, заменив путь:

$filePath = "path\to\excel.xslx" # replace filename

# function pulled from /6044513/kak-vyzvat-slozhnyi-com-metod-iz-powershell
# allows for calling complex COM object's methods... I can define which arguments I want to send in
Function Invoke-NamedParameter {
    [CmdletBinding(DefaultParameterSetName = "Named")]
    param(
        [Parameter(ParameterSetName = "Named", Position = 0, Mandatory = $true)]
        [Parameter(ParameterSetName = "Positional", Position = 0, Mandatory = $true)]
        [ValidateNotNull()]
        [System.Object]$Object
        ,
        [Parameter(ParameterSetName = "Named", Position = 1, Mandatory = $true)]
        [Parameter(ParameterSetName = "Positional", Position = 1, Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$Method
        ,
        [Parameter(ParameterSetName = "Named", Position = 2, Mandatory = $true)]
        [ValidateNotNull()]
        [Hashtable]$Parameter
        ,
        [Parameter(ParameterSetName = "Positional")]
        [Object[]]$Argument
    )

    end {  ## Just being explicit that this does not support pipelines
        if ($PSCmdlet.ParameterSetName -eq "Named") {
            ## Invoke method with parameter names
            ## Note: It is ok to use a hashtable here because the keys (parameter names) and values (args)
            ## will be output in the same order.  We don't need to worry about the order so long as
            ## all parameters have names
            $Object.GetType().InvokeMember($Method, [System.Reflection.BindingFlags]::InvokeMethod,
                $null,  ## Binder
                $Object,  ## Target
                ([Object[]]($Parameter.Values)),  ## Args
                $null,  ## Modifiers
                $null,  ## Culture
                ([String[]]($Parameter.Keys))  ## NamedParameters
            )
        } else {
            ## Invoke method without parameter names
            $Object.GetType().InvokeMember($Method, [System.Reflection.BindingFlags]::InvokeMethod,
                $null,  ## Binder
                $Object,  ## Target
                $Argument,  ## Args
                $null,  ## Modifiers
                $null,  ## Culture
                $null  ## NamedParameters
            )
        }
    }
}

# create Excel COM object, set to suppress alert boxes
$excelapp = new-object -com Excel.Application
$excelapp.displayalerts = $false

# open workbook with CorruptLoad = Repair
[void](invoke-namedparameter $excelapp.workbooks "Open" @{"Filename"=$filepath; "CorruptLoad"=2})

# save repaired file and close
$excelapp.activeworkbook.saveas($filepath)
$excelapp.quit()
0 голосов
/ 23 мая 2013

Я знаю, что это уже старо, но на случай, если это кому-то поможет, вы можете попробовать добавить:

$ word.visible = false

$ word.DisplayAlerts ="wdAlertsNone"

0 голосов
/ 09 декабря 2011

Я столкнулся с той же проблемой, мой скрипт не закрывает документ правильно, попробуйте это, чтобы избежать повреждения документа:

0 голосов
/ 09 декабря 2011

Вы можете попробовать открыть ваши документы так:

$word.documents.Open($inputFile, $refFalse,  $true, $null, $null, $null, $null, $null, $null, $null, $null, $null, $false, $null, $null, $null)

Таким образом, вы говорите Word не восстанавливать поврежденный файл .... но я не могу проверить это и не знаю, как работает ваш скрипт.

Посмотрите здесь другие параметры MSDN

...