none
Convertir 37.000 fichiers DOC ou XLS vers DOCX ou XLSX RRS feed

  • 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

    mardi 20 septembre 2016 18:57

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
    mercredi 21 septembre 2016 07:52

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
    mercredi 21 septembre 2016 07:52
  • 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|

    mercredi 21 septembre 2016 08:41
  • 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


    mercredi 21 septembre 2016 12:38