PowerShell · 21.08.2022

Пачкой .doc в .docx и наоборот

Во время миграции web-проекта, под завязку забитого doc файлами, возникла проблема общей «массы» всех этих файлов. Зипование doc’ов отметалось сразу, так как требовалось жёсткое соблюдение правил размещаемого контента для конечного пользователя. Остался только один выход — массовый перегон всех файлов в новый docx формат…

Ни для кого не секрет, что формат docx «весит» куда меньше, чем формат doc. В принципе, при конвертации старого формата документа Word в новый можно существенно сократить занимаемое пространство.

На саму функцию конвертации я наткнулся вот здесь. Этот код я обернул в комментарии, подрихтовал и добавил switch для обратной связи с пользователем. Также в общий функционал скрипта включил и обратную конвертацию из docx в doc. Мало ли — может кому пригодится.

# Заголовок скрипта #
[System.Console]::Title = "WordConvert"

Write-Host
Write-Host "---------------------------------" -ForegroundColor Yellow
Write-Host "  1. Конвертировать DOC в DOCX"    -ForegroundColor Green
Write-Host "  2. Конвертировать DOCX в DOC"    -ForegroundColor Green
Write-Host "---------------------------------" -ForegroundColor Yellow
Write-Host

# Выбор вариантов #
$choice=Read-Host "Выберите вариант"
        Write-Host

# Путь хранения файлов #
# По умолчанию файлы должны быть в одной папке со скриптом #
$path = $PSScriptRoot

        switch($choice)
        {
         # Конвертировать DOC в DOCX #
         1{ # Создание COM объекта Word #
            $word_app = New-Object -ComObject Word.Application 
            # Установка формата для сохранения в DOCX #
            $Format = [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatXMLDocument
            # Поиск файлов doc и пересохранение в docx #
            Get-ChildItem -Path $path -Filter *.doc | ForEach-Object {
            $document = $word_app.Documents.Open($_.FullName)
            $docx_filename = "$($_.DirectoryName)\$($_.BaseName).docx"
            $document.SaveAs([ref] $docx_filename, [ref]$Format)
            $document.Close() }
            # Закрытие COM объекта Word #
            $word_app.Quit()
          }

         # Конвертировать DOCX в DOC #
         2{ # Создание COM объекта Word #
            $word_app = New-Object -ComObject Word.Application 
            # Установка формата для сохранения в DOC #
            $Format = [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatDocument97
            # Поиск файлов docx и пересохранение в doc #
            Get-ChildItem -Path $path -Filter *.docx | ForEach-Object {
            $document = $word_app.Documents.Open($_.FullName)
            $docx_filename = "$($_.DirectoryName)\$($_.BaseName).doc"
            $document.SaveAs([ref] $docx_filename, [ref]$Format)
            $document.Close() }
            # Закрытие COM объекта Word #
            $word_app.Quit()
          }

         default { Write-Host "Необходимо выбрать корректный вариант!" -ForegroundColor Red }
       }

Перечень доступных форматов для конвертации подобным методом изложен вот здесь.

Эксперименты со связкой Word и PowerShell уже проводились мной где-то здесь.