4 votes

Le code PrintOut fonctionne avec PowerShell v 5.1, mais pas avec 7.3

J'essaie d'imprimer des parties de plusieurs fichiers docx. Le code ci-dessous fonctionne dans Windows PowerShell 5.1, mais pas dans PowerShell 7.3. J'aimerais comprendre pourquoi et obtenir de l'aide pour mettre à jour le code afin qu'il fonctionne dans PowerShell 7.3.

$path = 'D:\SchoolWeb\DOCXtoPDF\test.docx' #Path to docx

$Word = New-Object -ComObject Word.Application #open MS Word app
$Word.Visible = $false #hide the MS Word app
$docx = $Word.Documents.Open($path) #Open the docx from the path into the open MS Word app

$pagesNum = $Word.ActiveDocument.ComputeStatistics([Microsoft.Office.Interop.Word.WdStatistic]::wdStatisticPages) #Get the number of pages in the docx
$max=$pagesNum-2 #Get the maximum pages because the last two pages are not important

$Missing    = [System.Reflection.Missing]::Value  # Default values
$BackGround = 0
$Append     = 0
$Range      = 4 #https://learn.microsoft.com/en-us/office/vba/api/word.wdprintoutrange
$OutputFileName = $Missing
$From       = $Missing # values I've tried "1"
$To     = $Missing # values I've tried $max
$Item       = 0
$Copies     = 1
#$Pages = $max # values I've tried 
if ($max -gt 1) { $Pages = "1-$max" } else { $Pages = "1" }

$Word.PrintOut([ref]$BackGround, [ref]$Append, [ref]$Range, [ref]$OutputFileName, [ref]$From, [ref]$To, [ref]$Item, [ref]$Copies, [ref]$Pages)

$docx.Close($false)
$Word.Quit()

Dans Powershell 7.3, j'obtiens une MethodException "Exception setting "PrintOut" : Cannot convert the "1" value of type "string" to type "Object"."

Je sais que cela concerne la variable $Pages.

Voici quelques endroits où j'ai déjà cherché :

Merci d'avoir expliqué pourquoi le code fonctionne dans un PowerShell et pas dans l'autre et de m'avoir aidé à corriger le code pour qu'il fonctionne dans PowerShell 7.3.

0voto

iRon Points 41

Il n'est pas certain qu'il s'agisse d'une dérive...
Je soupçonne que les types de paramètres (pas seulement les pages ) ne sont pas correctement alignés (leur position).
Quoi qu'il en soit, pour résoudre votre problème, je vous recommande d'utiliser des paramètres nommés. Voir cette réponse : Comment appeler une méthode COM complexe à partir de PowerShell ?

$Word.GetType().InvokeMember('PrintOut', [System.Reflection.BindingFlags]::InvokeMethod,
    $null,  ## Binder
    $Word,  ## Target
    ([Object[]]1),  ## Args
    $null,  ## Modifiers
    $null,  ## Culture
    ([String[]]'Pages')  ## NamedParameters
)

ou en utilisant la fonction dans la réponse référencée :

Invoke-NamedParameter $Word Printout @{ Pages = 1 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X