質問: ### 前提・実現したいこと 対象PCにインストールされているOffice製品(ExcelやWord)などがどのバージョンか コードから調べる方法を調査していますが、方法が分かりません。 Office2013までは内部バージョンで判定をすることにより、2007や2013と判定することができましたが、Office2016以降2019、Office365製品では全て同じ内部バージョン(16.x)となっているようで旧来の判定方法では対応できません。 画面上では、[ファイル]タブ=>[アカウント]上にて、 インストールされている製品が何かわかります。 なんらかの方法により画面上と同じように Office2016のExcel2016 Office2019のExcel2019 Office365のExcel といったように 判定する方法をどなたかご存じでないでしょうか? 宜しくお願い致します。
回答: ろくに動作確認出来ていませんが一例として。 UIAutomationとかを使って表示されている文字からそれっぽいものを抜き出すコードです。 Windows PowerShell ISEとかに貼り付けて実行してみてください。 ``` # 必要なライブラリロード Add-Type -AssemblyName UIAutomationClient, System.Windows.Forms, Microsoft.VisualBasic # Excelを新規でインスタンス [__ComObject]$appXl = New-Object -ComObject Excel.Application -Property @{Visible = $true} ### [ファイル]タブ=>[アカウント] を開く ### # 無理矢理SendKeysで操作。UIAutomationをちゃんと使えば無しで行けるとは思うけれど # 待ち時間(Start-Sleep)は適度に調整 # Excelを最前面に [Microsoft.VisualBasic.Interaction]::AppActivate($appXl.Caption) Start-Sleep -Seconds 1 # 「Alt+F+D」のキーを送信して [ファイル]タブ=>[アカウント] を開く [Windows.Forms.SendKeys]::SendWait('%F') Start-Sleep -Seconds 1 [Windows.Forms.SendKeys]::SendWait('%D') Start-Sleep -Seconds 1 ### UIAutomationで要素を走査して製品情報ぽいものを探す ### # UIAutomation補助関数 function Get-UIChildren { [CmdletBinding()] [OutputType([Windows.Automation.AutomationElement])] Param ( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [Windows.Automation.AutomationElement[]]$InputObject, [Windows.Automation.TreeScope]$TreeScope = [Windows.Automation.TreeScope]::Children ) Process { foreach( $ele in $InputObject ) { $ele.FindAll($TreeScope, [Windows.Automation.Condition]::TrueCondition) | Write-Output } } } # Excelトップを取得 [IntPtr]$hwndXl = $appXl.Hwnd $xlAutoEle = [Windows.Automation.AutomationElement]::FromHandle( $hwndXl ) # 子要素群取得 [Windows.Automation.AutomationElement[]]$elements = $xlAutoEle | Get-UIChildren -TreeScope Descendants # 製品情報っぽいものを探す [Windows.Automation.AutomationElement+AutomationElementInformation[]]$officeInfo? = $elements | % { $_.Current } | ? { # テキストで、'Microsoft Office'が含まれるもの $_.ControlType -eq [Windows.Automation.ControlType]::Text -and $_.Name -match 'Microsoft Office' } # | Select-Object -Property ClassName, LocalizedControlType, ControlType, Name # 取得した要素の名前を出力 $officeInfo? | Select-Object -ExpandProperty Name $appXl.Quit() ``` Office2016(Office 365)やOffice2013の環境では以下の文字列がコンソールに出力されました。 ``` Microsoft Office 365 Microsoft Office Professional 2013 ``` UIAutomation周りのアプローチは以下のサイトも参考になると思います(私は、正直ろくに知識が無いので)。 > > Officeアプリケーションのバージョン情報ダイアログから情報を取得するVBScript | 初心者備忘録 > > >