Konvertieren eines Dokuments von DOC nach DOCX

15.05.2018 0 Von Frank

Eine installierte Word-Version vorausgesetzt, kann man die Office API verwenden, um per PowerShell ein .doc Dokument nach .docx zu konvertieren.

Die folgende Prozedur erwartet als Übergabe folgende Parameter:

  • $srcFilePath: Der Pfad zu einer Datei ohne Dateiname
  • $srcFileName: Der Name der Datei ohne Pfad

Die Prozedur startet im Hintergrund eine Word-Instanz, führt eine Konvertierung von .doc nach .docx aus, speichert die .docx Datei im gleichen Verzeichnis, in dem sich die .doc Datei befindet und beendet die Word-Instanz wieder. Es sollte noch beachtet werden, dass sich keine .docx mit gleichem Namen im angegebenen Verzeichnis befindet, da diese überschrieben wird.

Tritt in der Funktion eine Exception auf, wird das in der Fehlerbehandlung ausgegeben und ein $true zurückgeliefert.

# DOC Datei nach DOCX konvertieren
function Invoke-ConvertDOCToDOCX {
  Param ([Parameter(Mandatory=$true, ValueFromPipeline = $false)] $srcFilePath,
       [Parameter(Mandatory=$true, ValueFromPipeline = $false)] $srcFileName
       )

  # Konvertieren von DOC zu DOCX ohne Kompatiblitätsmodus
  $conv_error = $false
  try {
    # Starten der Word Instanz
    $word = new-object -comobject Word.application
    $word.DisplayAlerts = "wdAlertsNone"
    $word.Visible = $false
  
    $wordSaveFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat],"wdFormatDocumentDefault");
    
  #Datei selektieren
    [System.Array]$docfiles = Get-ChildItem -Path $srcFilePath -Recurse:$false -Filter $srcFileName

    if($docfiles -eq $null) {
      # DOC Datei nicht gefunden 
      write-host "! DOC Datei nicht vorhanden: $srcFilePath - $srcFileName"
    }
    else {
      # DOC Datei gefunden - Konvertierung starten
      Foreach ($docfile in $docfiles) {
        $opendoc = $word.documents.open($docfile.FullName)
        
        $savename = ($docfile.fullname).substring(0,($docfile.FullName).lastindexOf("."))+".docx"
        $opendoc.Convert()
        $opendoc.saveas([ref]"$savename", [ref]$wordSaveFormat);
        $opendoc.close();
        write-host "Konvertierung erfolgreich"
      }
    }
  $word.Quit()
  while( [System.Runtime.Interopservices.Marshal]::ReleaseComObject($word)){}
  }
  catch [Exception] {
    $conv_error = $true
    write-host "! Fehler Dateikonvertierung DOC nach DOCX"
  }
  return $conv_error
}