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)」
となります。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます