chromedirver.exeとchrome.exeのバージョンを調べる

このページのバージョンの「調べ方」はVBAを使った調べ方です

chrome.exeのdev版とかbeta版は考慮していません

VBAで調べる利点は自動更新プログラムの作成時ぐらいなのでメモ気分で書いています

chromedirver.exeのバージョンの調べ方

あまり知られていません(多分)がchromedriver.exeのバージョンchromedriver.exeを実行することで確認できます
※chromedriver.exeはSeleniumBasicフォルダにあるそれです

chromedriver.exeの実行結果

最初に出力されてる「Starting ChromeDriver 103.0.5060.53」が今のバージョンですね

これを踏まえてVBAでの取得方法です

まずSeleniumBasicフォルダのパスを取得する

インストールする途中でパスが表示されているはずなので自分で使う場合はそのままハードコーティングしてもok

とは言え、誰かに渡す時はパスがわからないので環境変数から取得する方が吉

SeleniumBasicフォルダのパターンは

  • C:\Program Files\SeleniumBasic
  • C:\Users\<ユーザー名>\AppData\Local\SeleniumBasic

のどちらかなので「Select Case」や「If」でどっちにフォルダがあるかチェックする

後者の場合はユーザー名がわからないのでEnviron関数を使って環境変数で取得するようにする

Dim ChromeDriverPath  As String '---SeleniumBasicのパス変数
With CreateObject("Scripting.FileSystemObject")
    Select Case True
        Case .FolderExists(Environ("ProgramFiles(x86)") & "\SeleniumBasic")
            ChromeDriverPath = Environ("ProgramFiles(x86)") & "\SeleniumBasic"
        Case .FolderExists(Environ("ProgramFiles") & "\SeleniumBasic")
            ChromeDriverPath = Environ("ProgramFiles") & "\SeleniumBasic"
        Case .FolderExists(Environ("ProgramW6432") & "\SeleniumBasic")
            ChromeDriverPath = Environ("ProgramW6432") & "\SeleniumBasic"
        Case .FolderExists(Environ("LOCALAPPDATA") & "\SeleniumBasic")
            ChromeDriverPath = Environ("LOCALAPPDATA") & "\SeleniumBasic"
        Case Else
            MsgBox "'SeleniumBasic'のフォルダが見つかりませんでした", vbCritical
            GetChromeDriverVersion = ""
            Exit Function
    End Select
End With

VBAで「chromedriver.exe」の実行結果を取得する

VBAでexeファイルを実行するならWScript.Shellを使えば実行できます

直接実行した場合、Exec・Runのどちらで実行しても課題が残るので結論を言うと一度ログファイルに実行結果を出力して、そのログファイルを読み込むようにしました

With CreateObject("Scripting.FileSystemObject")
    '---バージョンチェック用のバッチを作成する
    If .FileExists(ThisWorkbook.Path & "\chromedriver.bat") = False Then
        Open ThisWorkbook.Path & "\chromedriver.bat" For Output As #1
            Print #1, Chr(34) & ChromeDriverPath & "\chromedriver.exe" & Chr(34) & " > " & Chr(34) & ThisWorkbook.Path & "\chromedriver.log" & Chr(34)
        Close
    End If
End With
'---バージョンチェック用のバッチを実行する
wsh.Run "%ComSpec% /c " & Chr(34) & ThisWorkbook.Path & "\chromedriver.bat" & Chr(34), 0

ログファイルからバージョン情報を取得する

バージョン情報は一行目にあって規則的な出力になってるので

  1. 「Starting ChromeDriver 」を削除
  2. 最初の空白までをLeft関数とInstr関数、Find関数の組み合わせで取得

とかで取得できるものの、多分一番手っ取り早いのは正規表現での取得
※慣れてないと正規表現って蕁麻疹出ますよね…

ちなみにリビジョン番号は不要でビルド番号まであればOK

'---ログファイルの一行目を取得
Open ThisWorkbook.Path & "\chromedriver.log" For Input As #1
    Line Input #1, buf
Close
'---正規表現でバージョン情報を取得する
Set objReg = CreateObject("VBScript.RegExp")
objReg.Pattern = "\d+\.\d+\.\d+" '---ビルド番号までを正規表現で取得する
Set objMat = objReg.Execute(buf)
GetChromeDriverVersion = objMat.Item(0)

最終的なサンプルソース

これまでのソースを組み合わせて要所で待機を入れたり不要になったファイルを削除したりして整理したソースがコチラ

Function GetChromeDriverVersion()
Dim objReg As Object ' VBScript_RegExp_55.RegExp '--- 「Microsoft VBScript Regular Expressions 5.5」の参照設定
Dim objMatch As Object 'MatchCollection '--- 「Microsoft VBScript Regular Expressions 5.5」の参照設定
Dim wsh As Object: Set wsh = CreateObject("WScript.Shell")
Dim buf As String
'---起動しているchromedriver.exeがあれば落とす
Call Shell("cmd.exe /c taskkill /F /IM chromedriver.exe")
Application.Wait Now + TimeSerial(0, 0, 1)
'---SeleniumBasicフォルダーを探す
Dim ChromeDriverPath  As String '---SeleniumBasicのパス変数
With CreateObject("Scripting.FileSystemObject")
    Select Case True
        Case .FolderExists(Environ("ProgramFiles(x86)") & "\SeleniumBasic")
            ChromeDriverPath = Environ("ProgramFiles(x86)") & "\SeleniumBasic"
        Case .FolderExists(Environ("ProgramFiles") & "\SeleniumBasic")
            ChromeDriverPath = Environ("ProgramFiles") & "\SeleniumBasic"
        Case .FolderExists(Environ("ProgramW6432") & "\SeleniumBasic")
            ChromeDriverPath = Environ("ProgramW6432") & "\SeleniumBasic"
        Case .FolderExists(Environ("LOCALAPPDATA") & "\SeleniumBasic")
            ChromeDriverPath = Environ("LOCALAPPDATA") & "\SeleniumBasic"
        Case Else
            MsgBox "'SeleniumBasic'のフォルダが見つかりませんでした", vbCritical
            GetChromeDriverVersion = ""
            Exit Function
    End Select
    
    '---バージョンチェック用のバッチがなかったら作成する
    If .FileExists(ThisWorkbook.Path & "\chromedriver.bat") = False Then
        Open ThisWorkbook.Path & "\chromedriver.bat" For Output As #1
            Print #1, Chr(34) & ChromeDriverPath & "\chromedriver.exe" & Chr(34) & " > " & Chr(34) & ThisWorkbook.Path & "\chromedriver.log" & Chr(34)
        Close
    End If
End With
'---バージョンチェック用のバッチを実行する
wsh.Run "%ComSpec% /c " & Chr(34) & ThisWorkbook.Path & "\chromedriver.bat" & Chr(34), 0
Application.Wait Now + TimeSerial(0, 0, 1)
'---起動しているchromedriver.exeを落とす
Call Shell("cmd.exe /c taskkill /F /IM chromedriver.exe")
Application.Wait Now + TimeSerial(0, 0, 1)
'---ログファイルの一行目を取得
Open ThisWorkbook.Path & "\chromedriver.log" For Input As #1
    Line Input #1, buf
Close
'---正規表現でバージョン情報を取得する
Set objReg = CreateObject("VBScript.RegExp")
objReg.Pattern = "\d+\.\d+\.\d+" '---ビルド番号までを正規表現で取得する
Set objMatch = objReg.Execute(buf)
GetChromeDriverVersion = objMatch.Item(0)
'---作業が終わったらバッチファイルとログファイルを削除する
Do
    Err.Clear
    On Error Resume Next
    Kill ThisWorkbook.Path & "\chromedriver.bat"
    Kill ThisWorkbook.Path & "\chromedriver.log"
    On Error GoTo 0
Loop While Err.Number <> 0
Set wsh = Nothing
End Function

Chrome.exeのバージョン取得方法

私が知ってるだけで取得方法は2つ

他にレジストリから取得する方法もあるけどそこまでする必要ないかなって思う

バージョン情報ファイルを参照する

私はこの方法を採用しています

バージョン情報が記載されている便利なファイルがあります

%LOCALAPPDATA%\Google\Chrome\User Data\Last Version

拡張子は無いですがメモ帳などで開けば中身の確認ができてVBAでもテキストファイルの読み込みと同じ手法でデータの取得ができる

最終的にはchromedirver.exeの時と同じで正規表現でビルド番号まで取得する

Private Function GetChromeAppVersion() As String
'====================================================================================================
'Google.exeのバージョンを取得する
'====================================================================================================
Dim VersionFile As String
Dim buf As String
VersionFile = Environ("LOCALAPPDATA") & "\Google\Chrome\User Data\Last Version"
If CreateObject("Scripting.FileSystemObject").FileExists(VersionFile) Then
    Open VersionFile For Input As #1
        Line Input #1, buf
        '---正規表現でバージョン情報を取得する
        Set objReg = CreateObject("VBScript.RegExp")
        objReg.Pattern = "\d+\.\d+\.\d+" '---ビルド番号までを正規表現で取得する
        Set objMat = objReg.Execute(buf)
        GetChromeAppVersion = objMat.Item(0)
    Close
Else
    MsgBox "Chrome.exe のバージョンが取得できませんでした", vbCritical
    GetChromeAppVersion = ""
End If
End Function

chrome.exeと同じディレクトリにあるバージョンフォルダから読み取る

chrome.exeが保存されているフォルダの中にバージョン名のフォルダがあるのでここから取得する

複数バージョンフォルダがあった時の考慮をしてないからもう少し丁寧にやったほうがいいかもとか思いつつ、こっちのパターンは使わない想定なのでこんなもんで

Function GetChromeExeVersion()
Dim objReg As Object ' VBScript_RegExp_55.RegExp '--- 「Microsoft VBScript Regular Expressions 5.5」の参照設定
Dim objMatch As Object 'MatchCollection '--- 「Microsoft VBScript Regular Expressions 5.5」の参照設定
Dim objFso As New Scripting.FileSystemObject
Dim objFolder As Folder
GetChromeExeVersion = ""
'---chrome.exeがあるフォルダーを探す
Dim ChromeExePath  As String '---chrome.exeがあるフォルダーのパス変数
With CreateObject("Scripting.FileSystemObject")
    Select Case True
        Case .FolderExists(Environ("ProgramFiles(x86)") & "\Google\Chrome\Application")
            ChromeExePath = Environ("ProgramFiles(x86)") & "\Google\Chrome\Application"
        Case .FolderExists(Environ("ProgramFiles") & "\Google\Chrome\Application")
            ChromeExePath = Environ("ProgramFiles") & "\Google\Chrome\Application"
        Case .FolderExists(Environ("ProgramW6432") & "\Google\Chrome\Application")
            ChromeExePath = Environ("ProgramW6432") & "\Google\Chrome\Application"
        Case .FolderExists(Environ("LOCALAPPDATA") & "\Google\Chrome\Application")
            ChromeExePath = Environ("LOCALAPPDATA") & "\Google\Chrome\Application"
        Case Else
            MsgBox "'chrome.exe'のフォルダが見つかりませんでした", vbCritical
            Exit Function
    End Select
    
    '---サブフォルダの名前を正規表現でマッチさせて取得する
    For Each objFolder In .GetFolder(ChromeExePath).SubFolders
        '---正規表現でバージョン情報を取得する
        Set objReg = CreateObject("VBScript.RegExp")
        objReg.Pattern = "\d+\.\d+\.\d+" '---ビルド番号までを正規表現で取得する
        Set objMatch = objReg.Execute(objFolder.Name)
        If objMatch.Count > 0 Then
            GetChromeExeVersion = objMatch.Item(0)
            Exit For
        End If
    Next
End With
If GetChromeExeVersion = "" Then
    MsgBox "chrome.exeのバージョンが取得できませんでした", vbCritical
End If
End Function

あとがき

2022年8月現在ではこのプログラムを使って自動更新プログラムを作ってます

書いてて改めて思いましたがやっぱり自動更新プログラムの作成時ぐらいしか活用方法ない気がする…

コメント

タイトルとURLをコピーしました