3 votes

Powershell - Fonction SaveAs quand le fichier existe déjà

J'essaie d'exécuter un code qui recherche tous les fichiers .doc et .docx dans un répertoire et des sous-répertoires, puis convertit chacun d'eux au format PDF.

Le code ci-dessous ne fonctionne que s'il n'y a aucune instance du pdf dans ces répertoires, c'est-à-dire qu'il ne fonctionne que la première fois. Chaque fois suivante, il échoue avec :

Exception lors de l'appel de "SaveAs" avec "2" argument(s) : "Commande échouée". À l'adresse C:\convert\convertword.ps1 :12 char:13 + $doc.saveas <<<< ($path, $wdFormatPDF) + CategoryInfo : NotSpecified : ( :) [], MethodInvocationException + FullyQualifiedErrorId : ComMethodTargetInvocation

Lorsque je supprime les PDF précédemment créés et que j'exécute à nouveau le PS, tout fonctionne bien. Par conséquent, je ne peux que supposer qu'il y a un commutateur ou un paramètre que je n'ai pas trouvé dans mon programme. SaveAs qui force en quelque sorte l'écrasement ?

$wdFormatPDF = 17
$word = New-Object -ComObject word.application
$word.visible = $false
$folderpath = "c:\convert\*"
$fileTypes = "*.docx","*doc"
Get-ChildItem -path $folderpath -recurse -include $fileTypes |
foreach-object `
{
$path =  ($_.fullname).substring(0,($_.FullName).lastindexOf("."))
"Converting $path to pdf ..."
$doc = $word.documents.open($_.fullname)
$doc.saveas($path, $wdFormatPDF) 
$doc.close()
}
$word.Quit()

2voto

SuperSub Points 87

Ok, je pense enfin avoir trouvé le problème. C'est le Volet d'aperçu de l'Explorateur Windows qui verrouille le fichier. J'avais le volet de prévisualisation activé sur le répertoire où les fichiers étaient créés et convertis, cela a dû créer un verrouillage de fichier sur les pdf, donc le script ne peut pas enregistrer le nouveau pdf. J'ai désactivé le volet de prévisualisation dans mon explorateur Windows et le script fonctionne maintenant à plusieurs reprises ! Il n'y a donc rien d'anormal avec le script Powershell, mais merci pour tous les commentaires. Voici un lien vers l'article MS KB le plus proche que j'ai pu trouver sur le sujet. http://support.microsoft.com/kb/942146

1voto

CB. Points 24549

Essayez ceci :

$word.displayalerts = $false
$doc.saveas($path, $wdFormatPDF) # with Word2010 I've to use  $doc.saveas([ref]$path, [ref]$wdFormatPDF)
$word.displayalerts = $true

Aucune erreur n'est signalée, mais j'utilise Word2010 ; je ne peux pas le tester avec d'autres versions.

0voto

Andy Arismendi Points 16501

Il n'y a pas de drapeau pour écraser selon la documentation de SaveAs y SaveAs2 . Vous pouvez donc l'enlever avant de sauvegarder avec quelque chose comme ceci :

Remove-Item -Path $path -Force -ErrorAction SilentlyContinue
$doc.saveas ($path, $wdFormatPDF)

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