独り言

プログラミングの講師をしています。新人研修で扱う技術の解説と個人の技術メモ、技術書の紹介など

【PowerShell】PowerPintのプロパティのタイトルを一括で変更する

PowerPointExcelなどのOffice製品では、プロパティでタイトルを設定することができます。
PowerPointだけを使っている場合にはあまり意識しなくても良い部分ですが、PDFにエクスポートする時ファイルのタイトルとしてタブに表示されます。
ファイル名と同じにしておくと無難ですが、ファイルがたくさんあると一つ一つ変更するのは面倒です。
大量にあるPowerPointのファイルのタイトルをファイル名に変更してPDFとして出力するPowerShellスクリプトです。
試行錯誤した履歴も含めて。

# 最初は再帰でやろうとしたけど失敗。無限ループになる
# Function titleRename($dir) {
#    foreach($file in $dir) {
#         if ($file.Mode.Substring(0,1) -eq "d") {
#             check $file
#         } ElseIf($file.Name.Substring($file.Name.Length - 5, 5) -eq ".pptx") {
#             $ppt = New-Object -ComObject PowerPoint.Application
#             $pres = $ppt.Presentations.Open($file.FullName)
#             $pres.BuiltInDocumentProperties("title") = $pres.Name.substring(0, $pres.Name.length - 5)
#             $pres.Save()
#             $pres.Close()
#             $ppt.Quit() 
#         }
#     }
# }
# $dir = Get-ChildItem 
# titleRename $dir

# -Recurseで取得するようにしたらうまくいった
$dir = Get-ChildItem -Recurse
$ppt = New-Object -ComObject PowerPoint.Application
foreach($file in $dir) {
    # 拡張子が.pptxのファイルを対象にする
    If (($file.Name.Length -gt 5) -And ($file.Name.Substring($file.Name.Length - 5, 5) -eq ".pptx")) {
        $pres = $ppt.Presentations.Open($file.FullName)
        # プロパティのタイトルをファイル名に変更
        $pres.BuiltInDocumentProperties("title") = $pres.Name.substring(0, $pres.Name.length - 5)
        $pres.Save()
        # PDFに出力する
        $pres.SaveAs($file.FullName.Substring(0, $file.FullName.Length - 5), 32)
        $pres.Close()
    }
}
$ppt.Quit() 

# 上で方法でもできたけどもうちょっと最適化
# フィルターをかけてForEach-Objectにしてみた
$ppt = New-Object -ComObject PowerPoint.Application
Get-ChildItem -Recurse -Filter *.pptx | ForEach-Object {
    $pres = $ppt.Presentations.Open($_.FullName)
    # プロパティのタイトルをファイル名に変更
    $pres.BuiltInDocumentProperties("title") = $pres.Name.substring(0, $pres.Name.length - 5)
    $pres.Save()
    # PDFに出力する 第二引数はファイルタイプ。PDFは32
    $pres.SaveAs($_.FullName.Substring(0, $_.FullName.Length - 5), 32)
    $pres.Close()
}
$ppt.Quit()