2021年4月29日

【PowerShell】WORDのdocファイルをdocxに変換するスクリプト


最近仕事で、昔作られたWordの仕様書を見る機会があったのですが、ファイル形式が古くて「doc」形式だったんです。 docでも見るぶんにはなんら問題はないのですが、今後のことを考えて一つ一つ開いて「docx」形式で保存するということやっていたんです。

しかし、ファイル数が多いんです。100近くもあるんです。

それでまた思ったんですよ、「めんどくせぇー!」って。笑

というわけで「doc」形式のファイルを「docx」形式に変換するスクリプトを作りました。
###############################################################################
# docファイルをdocxに変換するスクリプト
###############################################################################

$targetPath = "C:\work"

#docファイルを取得
$files = Get-ChildItem -Path $targetPath | ? { $_.Extension -like "*.doc" }

#文書の保存形式(DOCX形式)
$wdFormatDocumentDefault = 16

foreach ($f in $files)
{
    Write-Host $f
    
    #Wordオブジェクトを生成
    $word = New-Object -ComObject Word.Application

    #ファイルをオープン
    $doc = $word.Documents.Open($f.FullName)
    
    #保存ファイル名(拡張子を変更)
    $outputfile = $f.FullName.Replace("doc", "docx")
    Write-Host $outputfile
    
    #保存
    $doc.SaveAs2([ref]$outputfile, [ref]$wdFormatDocumentDefault)
    
    #閉じる
    $doc.Close()
    
    #終了
    $word.Quit()
}

Write-Host "処理が完了しました。"
少し解説すると、最初の$targetPathはターゲットとなるフォルダを指定します。このフォルダ内にあるdocファイルを全て取得して順番に一つ一つ変換していきます。

やってることは単純なのでコードを見ていただければ分かると思いますが、ポイントは保存ファイル名と保存時のSaveAs2のパラメータです。

最初、保存ファイル名はただの文字列で指定していたのですが、保存時にエラーになってしまいうまくいかなかったのでこのようなやり方になりました。おそらくオブジェクト型でないとダメなのだと思います。

次にSaveAs2のパラメータですが、こちらは頭に[ref]を付ける必要があります。最初これに気付かずに非常に苦労しました。 なぜ参照渡しにしなければいけないのかよく分かりませんが、メソッドがそのように定義されているからなんでしょう。

<参考>
http://mtgpowershell.blogspot.com/2010/10/wordhtml.html
https://docs.microsoft.com/ja-jp/office/vba/api/word.wdsaveformat


スポンサーリンク