Meilleur auteur de réponses
Convertir 37.000 fichiers DOC ou XLS vers DOCX ou XLSX

Question
-
Bonjour à tous,
Débutant avec Powershell j'ai besoin de conseil pour me lancer dans mon "aventure". J'ai trouvé sur le net un script qui converti les doc en docx, je suppose que l’équivalent pour xls vers xlsx ne devrait pas me poser trop de problème. J'ai fait quelque essai sur 100 puis 200 fichiers, je n'ai pas eu de problème particulier. Je suis d'ailleurs surpris de la vitesse d’exécution.
Ma question est la suivante. Mes essais ont été fait dans un répertoire avec quelque sous répertoire mais rien de bien complexe. Est-ce que je risque quelque chose si je lance ça sur mon serveur pour faire les 37k fichiers en une fois ?? Sachant qu'il y a aussi des PDF dans ces répertoires et des fichiers déjà en docx ou xlsx évidement et aussi beaucoup de sous répertoire. Vous l'aurez compris mon but est de me débarrasser de tous les doc et xls encore présent sur le serveur.
Voici le script utilisé pour mes premier essai:
$word = new-object -comobject word.application $word.Visible = $False $saveFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat],”wdFormatDocumentDefault”); #Get the files $folderpath = “c:\mon_rep_de_test\*” $fileType = “*doc” Get-ChildItem -path $folderpath -include $fileType -recurse | foreach-object { $opendoc = $word.documents.open($_.FullName) $savename = ($_.fullname).substring(0,($_.FullName).lastindexOf(“.”)) $opendoc.Convert() $opendoc.saveas([ref]”$savename”, [ref]$saveFormat); $opendoc.close(); } #Clean up $word.quit()
Qu'en pensez vous, et avez vous des idées pour améliorer celui-ci ? Pour XLS aussi tant qu'on y est.
D'avance merci pour vos réponses.
Fred
Réponses
-
ça a l'air fonctionnel, mais sans gestion de l'existant
pour une amélioration directe,
- pense plutôt à utiliser une variable et de parcourir celle-ci aprés.
- Et d'alimenter celle-ci uniquement avec les valeurs que tu utilises
- Et pour la définition du nom, tu peut utiliser la propriété basename rendue par GCI
- vérifie que le documents, même si c'est un .DOC n'est pas au format DOCX
- vérifie que le DOCX existe déja ou pas
soit, un peu comme ceci:
$word = new-object -comobject word.application $word.Visible = $False #$saveFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat],”wdFormatDocumentDefault”); #Get the files $folderpath = “c:\mon_rep_de_test\*” $fileType = “*.doc” $filelist = Get-ChildItem -path $folderpath -include $fileType -recurse | select Name, DirectoryName, fullname, basename $ConvertedList = @() $RenamedList = @() $NothingDone = @() # loop foreach ($File in $Filelist) { $savename = "$($File.basename).docx" write-Host "Document en cours: $($File.name)" -back white -fore black $opendoc = $word.documents.open($File.FullName) $word.Visible = $False # test si le document est déja en format docx, openxml: switch ($opendoc.SaveFormat) { 0 { write-host "Format de fichier: Word 97/2003.DOC" # si dans ce format là et si DOCX absent, on le convertit et on sauve # si DOCX existant, on saute au fichier suivant if (test-path -path "$($File.DirectoryName)\$SaveName") { write-host "Le fichier $SaveName existe déjà" -foregroundcolor yellow $NothingDone += $File continue } write-host "Conversion du fichier $($File.Name)" -foregroundcolor green $opendoc.Convert() $opendoc.saveas(”$($File.DirectoryName)\$savename”, 12); $ConvertedList += $File $opendoc.close(); } 12 { $opendoc.close(); write-host "Format de fichier: Word 2007. DOCX" # si dans ce format là, on se contente de le renommer, si docx inexistant # si DOCX existant, on saute au fichier suivant if (test-path -path "$($File.DirectoryName)\$SaveName") { write-host "Le fichier $SaveName existe déjà" -foregroundcolor yellow $NothingDone += $File continue } write-host "renomage du fichier $($File.Name)" -foregroundcolor cyan Rename-Item -Path $File.FullName -NewName $SaveName $RenamedList += $File } } write-host ("=" * 75)`n } #Clean up $word.quit()
Tu pourras y ajouter l'export des listes vers CSV, pour avoir un log de ce qui est fait.
pour excel, il te suffira de trouver que sont le numéro de version pour XLS et XLSX avec la méthode .saveformat sur $OpenDocument
B.
- Modifié Bawilanemo mercredi 21 septembre 2016 08:15
- Proposé comme réponse Bawilanemo vendredi 30 septembre 2016 12:30
- Marqué comme réponse Fred HILBERT samedi 1 octobre 2016 18:47
Toutes les réponses
-
ça a l'air fonctionnel, mais sans gestion de l'existant
pour une amélioration directe,
- pense plutôt à utiliser une variable et de parcourir celle-ci aprés.
- Et d'alimenter celle-ci uniquement avec les valeurs que tu utilises
- Et pour la définition du nom, tu peut utiliser la propriété basename rendue par GCI
- vérifie que le documents, même si c'est un .DOC n'est pas au format DOCX
- vérifie que le DOCX existe déja ou pas
soit, un peu comme ceci:
$word = new-object -comobject word.application $word.Visible = $False #$saveFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat],”wdFormatDocumentDefault”); #Get the files $folderpath = “c:\mon_rep_de_test\*” $fileType = “*.doc” $filelist = Get-ChildItem -path $folderpath -include $fileType -recurse | select Name, DirectoryName, fullname, basename $ConvertedList = @() $RenamedList = @() $NothingDone = @() # loop foreach ($File in $Filelist) { $savename = "$($File.basename).docx" write-Host "Document en cours: $($File.name)" -back white -fore black $opendoc = $word.documents.open($File.FullName) $word.Visible = $False # test si le document est déja en format docx, openxml: switch ($opendoc.SaveFormat) { 0 { write-host "Format de fichier: Word 97/2003.DOC" # si dans ce format là et si DOCX absent, on le convertit et on sauve # si DOCX existant, on saute au fichier suivant if (test-path -path "$($File.DirectoryName)\$SaveName") { write-host "Le fichier $SaveName existe déjà" -foregroundcolor yellow $NothingDone += $File continue } write-host "Conversion du fichier $($File.Name)" -foregroundcolor green $opendoc.Convert() $opendoc.saveas(”$($File.DirectoryName)\$savename”, 12); $ConvertedList += $File $opendoc.close(); } 12 { $opendoc.close(); write-host "Format de fichier: Word 2007. DOCX" # si dans ce format là, on se contente de le renommer, si docx inexistant # si DOCX existant, on saute au fichier suivant if (test-path -path "$($File.DirectoryName)\$SaveName") { write-host "Le fichier $SaveName existe déjà" -foregroundcolor yellow $NothingDone += $File continue } write-host "renomage du fichier $($File.Name)" -foregroundcolor cyan Rename-Item -Path $File.FullName -NewName $SaveName $RenamedList += $File } } write-host ("=" * 75)`n } #Clean up $word.quit()
Tu pourras y ajouter l'export des listes vers CSV, pour avoir un log de ce qui est fait.
pour excel, il te suffira de trouver que sont le numéro de version pour XLS et XLSX avec la méthode .saveformat sur $OpenDocument
B.
- Modifié Bawilanemo mercredi 21 septembre 2016 08:15
- Proposé comme réponse Bawilanemo vendredi 30 septembre 2016 12:30
- Marqué comme réponse Fred HILBERT samedi 1 octobre 2016 18:47
-
Bonjour,
En plus des conseils de Bawilanemo, il faut faire attention à la profondeur des arborescences, sachant que Windows est limités à 256 caractères de mémoire.
L’information n’a de valeur que si elle est partagée!! AK |Mon Blog|
-
Parfait, merci.
Comme c'est Word qui pose problème actuellement je vais d'abord me concentrer sur les DOC vers DOCX.
J'ai fait un essai avec tes modifs Bawilanemo, c'est exactement ce qu'il me faut. Il faut juste que je trouve un moyen de supprimer les DOC après conversion. Pour l'instant il me les garde. (voir http://imgur.com/a/NWdR0)
En ce qui concerne la "profondeur" des dossiers j'avais déjà pu identifier les arborescences trop longue et faire le nettoyage. Merci Ahmed
- Modifié Fred HILBERT mercredi 21 septembre 2016 13:28