PMPの流儀

我が家の流儀

我が家で気になったことを夫婦で取り上げていきます

MENU

PowerShell で 複数のPowerPoint を結合・連結・マージ

PowerShellから 複数のPowerPoint を連結するプログラムを紹介します。PowerShellの強力なファイル処理を使う事で簡潔に書くことができます。

1.仕様

スクリプトディレクトリ上の pptx から頭が数字のファイルを抽出し、ソートしてその順序に連結してみます。

2.ソースコード

# Set-ExecutionPolicy RemoteSigned -Scope Process

#実行パスをカレントディレクトリに設定
Set-Location $PSScriptRoot

[Boolean]$first = $true

# 数字から始まる pptx ファイルを名前順に列挙

'.' | Get-ChildItem -Filter *.pptx | ? {$_ -match '^[0-9]+'} | Sort-Object -Property Name |
% {
    if($first) {
        $pptApp = New-Object -ComObject PowerPoint.Application
        $ppt = $pptApp.Presentations.Open($_.FullName)
        $first = $false
    } else {
        $ppt.Slides.InsertFromFile($_.FullName, $ppt.Slides.Count)
    }
}

$ppt.SaveAs( "$path\output.pptx")
$ppt.Close()
$ppt = $null

$pptApp.Quit()
$pptApp = $null
[GC]::Collect()

3. 解説

ファイルの列挙といえば Get-ChildItem です。そこからパイプを使って、絞り込み・ソートを経て、PowerPoint の処理まで完結させます。
PowerShellスクリプトはこの形で組むのが一番美しいので、従来のループ処理を組むような構造から決別しましょう。

InsertFromFile() が、開いているPowerPoint に別のPowerPointファイルの中身を連結している個所です。

Excel にある Visible で非表示処理はできないようです。
最後にやっている [GC]::Collect() は、カベージコレクションの強制実行です。これにより、COMオブジェクトである PowerPoint のWindowか即時消えます。ガベージコレクション前に注意すべきなのは、PowerPoint 系のオブジェクトを解放してあげる事です。そうしないとPowerPointのウインドウが残ってしまいます。