メモ
- PowerShellで [Interaction]::CreateObject と [Interaction]::CallByName の練習
- PowerShell.exeに貼り付ける場合は Ctrl + V で行う
- しおりのアクションに「別の文書内のページに移動」は無いと仮定する
- エラー処理やCOMオブジェクトの解放を気にしてないで練習以外では実行しない
- Acrobatがバックグラウンドプロセスとして残るのでタスク マネージャーからタスクを終了する
using namespace System.Runtime.InteropServices
using namespace Microsoft.VisualBasic
Set-StrictMode -Version Latest
Add-Type -AssemblyName System.Runtime.InteropServices
Add-Type -AssemblyName Microsoft.VisualBasic
$a = {
$null | Set-Clipboard
try {
$app = [Interaction]::CreateObject("AcroExch.App")
}
catch {
throw
}
$avDoc = $app.GetActiveDoc()
if ($null -eq $avDoc) {
Write-Verbose '$app.Exit()' -Verbose
[Interaction]::CallByName($app, "Exit", [CallType]::Method)
[void][Marshal]::FinalReleaseComObject($app)
throw '$null -eq $avDoc'
}
$pdDoc = $avDoc.GetPDDoc()
$jso = $pdDoc.GetJSObject()
$console = [Interaction]::CallByName($jso, "console", [CallType]::Get)
[Interaction]::CallByName($console, "show", [CallType]::Method)
[Interaction]::CallByName($console, "clear", [CallType]::Method)
[void][Interaction]::CallByName($console, "println", [CallType]::Method, "// JavaScript デバッガー")
[void][Marshal]::FinalReleaseComObject($console)
$bkmRoot = [Interaction]::CallByName($jso, "bookmarkRoot", [CallType]::Get)
try {
$bkms = [Interaction]::CallByName($bkmRoot, "children", [CallType]::Get)
}
catch {
[void][Marshal]::FinalReleaseComObject($bkmRoot)
[void][Marshal]::FinalReleaseComObject($jso)
[void][Marshal]::FinalReleaseComObject($pdDoc)
[void][Marshal]::FinalReleaseComObject($avDoc)
Write-Verbose '$app.Exit()' -Verbose
[Interaction]::CallByName($app, "Exit", [CallType]::Method)
[void][Marshal]::FinalReleaseComObject($app)
throw
}
$bookmark = [PSCustomObject[]]::new($bkms.length)
$pageNumTemp = [Interaction]::CallByName($jso, "pageNum", [CallType]::Get)
for ($i = 0; $i -lt $bkms.length; $i++) {
[Interaction]::CallByName($jso, "pageNum", [CallType]::Let, 0)
[Interaction]::CallByName($bkms[$i], "execute", [CallType]::Method)
$bookmark[$i] = [PSCustomObject]@{
PageNum = [Interaction]::CallByName($jso, "pageNum", [CallType]::Get) + 1;
Name = [Interaction]::CallByName($bkms[$i], "name", [CallType]::Get)
}
}
[Interaction]::CallByName($jso, "pageNum", [CallType]::Let, $pageNumTemp)
for ($i = 0; $i -lt $bkms.length; $i++) {
[void][Marshal]::FinalReleaseComObject($bkms[$i])
}
[void][Marshal]::FinalReleaseComObject($bkmRoot)
[void][Marshal]::FinalReleaseComObject($jso)
[void][Marshal]::FinalReleaseComObject($pdDoc)
[void][Marshal]::FinalReleaseComObject($avDoc)
Write-Verbose '$app.Exit()' -Verbose
[Interaction]::CallByName($app, "Exit", [CallType]::Method)
[void][Marshal]::FinalReleaseComObject($app)
Write-Verbose @"
`$bookmark
$(Out-String -InputObject $bookmark)
"@ -Verbose
Write-Verbose @"
Get-Process -Name Acrobat, AcroCEF
$(Out-String -InputObject (Get-Process -Name Acrobat, AcroCEF) -Width 80)
"@ -Verbose
Write-Verbose @"
`$bookmark | ConvertTo-Csv -NoTypeInformation | Set-Clipboard
"@ -Verbose
$bookmark | ConvertTo-Csv -NoTypeInformation | Set-Clipboard
}
& $a