6.置換結果を元にdocument.xmlを上書きする

対象ソースは以下の通り


#対象ファイルに内容を上書き(Powershellのバージョンによって対応法が異なるのでバージョンチェックして分岐)

if($PSVersionTable.PSVersion.Major -gt 5){

  #Powershellのバージョンが5より大きい=6以上なら

  Out-File -FilePath $wdXmlPath -InputObject $strRepRaw -Encoding utf8

}else{

  #Powershellのバージョンが5以下なら

  #あとは.NET FrameworkのIO処理を使って書く

  $UTF8woBOM = New-Object "System.Text.UTF8Encoding" -ArgumentList @($false)

  [System.IO.File]::WriteAllLines((Join-Path ($filePth + "\" + $fileNm + "\word") "document.xml"), @($strRepRaw), $UTF8woBOM)

}


さて、ここでPowershellのバージョン問題が生じました。

なので、自動的にPowershellのバージョンをチェックして分岐(if)するようにしてあります。

なお、私の使用しているパソコンのPowershellのバージョンは5.いくつなので一行で済む上の処理を通りません。

つまり、ここ、ノンデバッグ(でも間違いようがないから動くとは思う)


なんでこんなことになったかというと、UTF-8という文字コードのファイルは時としてファイル冒頭に「BOM(Byte Order Mark)」というものが付く場合があります。

Powershellのバージョン5以下でOut-FileでUTF-8を使用すると、この「BOM」が自動的に付加されますが、MS Office側はBOMが付いた状態のXMLでdocxファイルにしてやると見事に開いた時にエラーを起こします(なお、これでしばらくドツボにはまった)

Powershellのバージョン6以上だとOut-FileでUTF-8を使用した場合、BOMが付かない仕様となったため、 Out-Fileを使うだけで済みますが、5以下の場合は、わざわざ.NET FrameworkのIO処理を引きずり出して使う必要があります。

そうすると、ここの解説がバチクソ難しくなるので、バージョン5以下の場合は「なんか外部ソフト(とはいえWindows標準装備のはずのもの)に託しやがった」と考えてください。

バージョン6以上の場合は

「変数strRepRawの内容(-InputObject $strRepRaw)で変数wdXmlPathのファイルを(-FilePath $wdXmlPath)、文字コードUTF-8で(-Encoding utf8)上書き出力する(Out-File)」

となります。

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る