PowerShellから 複数のPowerPoint を連結するプログラムを紹介します。PowerShellの強力なファイル処理を使う事で簡潔に書くことができます。
1.仕様
スクリプトのディレクトリ上の pptx から頭が数字のファイルを抽出し、ソートしてその順序に連結してみます。
2.ソースコード
# Set-ExecutionPolicy RemoteSigned -Scope Process #実行パスをカレントディレクトリに設定 [string]$path = Split-Path $MyInvocation.MyCommand.Path -Parent Set-Location $path [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のウインドウが残ってしまいます。