【Powershell版】バッチファイルで「既定のブラウザ」をシークレットモード(InPrivateブラウズ、プライベートブラウジング)で起動する


概要

昔、ここでプライベートモードで既定のブラウザを起動するバッチファイルを書きましたが、
バッチファイルの文字列処理がアレすぎて無駄に長ったらしいものになってしまい、ちょっと使いにくそうな感じになっていたのでPowershellで書き直してみました。
(ついでにOpera、Vivaldi、Brave、ChromiumベースEdgeにも対応してみました)

Powershellコードの埋め込み、実行をバッチファイル一つで実現する方法につきましてはこちらを参考に少しだけ改造しました。

使い道

このバッチファイル(?)をUSBメモリに入れておけば、いちいちショートカットキーの入力やメニューの選択をすることなく
バッチファイルをダブルクリックするだけでシークレットモードでブラウジングを開始できます。
ネットカフェや出先のPC等で履歴を残さずにブラウジングしたいときに便利なんじゃないでしょうか。

コード(コピペして.batファイルとして保存すると使えます)

@setlocal enableextensions enabledelayedexpansion & set "SELFPATH=%~dp0" & set "SELF=%~f0" & PowerShell.exe -Command "& (Invoke-Expression -Command ('{#' + ((Get-Content '!SELF:'=''!') -join \"`n\") + '}'))" %* & exit /b !errorlevel!

#設定

#ここにURLやファイル名を記述すると起動時に開くようになります(引数がない場合)
$openfile = ""
#$openfile = $env:SELFPATH + "\test.html"  #USBメモリに入れたファイルを指定する場合はこんな感じで

#引数がある場合は引数を適用
if($args.length -gt 0){
    $openfile = $args -join " "
}

#ブラウザ情報
$browserdata = @(
    @{"command"="LaunchWinApp.exe"; "option"="-private"; "execute"="shell:AppsFolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge"},
    @{"command"="msedge.exe"; "option"="--inprivate"; "execute"=""},
    @{"command"="iexplore.exe"; "option"="-private"; "execute"=""},
    @{"command"="chrome.exe"; "option"="--incognito"; "execute"=""},
    @{"command"="brave.exe"; "option"="--incognito"; "execute"=""},
    @{"command"="Launcher.exe"; "option"="--private"; "execute"=""},
    @{"command"="vivaldi.exe"; "option"="--incognito"; "execute"=""},
    @{"command"="firefox.exe"; "option"="-private-window"; "execute"=""}
)

#初期化
$script:reg = ""
$script:execute = ""
$script:option = ""


#レジストリキーが存在しない例外をcatchするにはこのコードが必要らしい
$ErrorActionPreference = "stop"

#HKEY_CLASSES_ROOTは事前には登録されてないので登録する必要があるらしい
New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT | Out-Null

try{
    #既定のブラウザのIDを取得
    $script:reg=Get-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\Shell\Associations\URLAssociations\http\UserChoice" -Name ProgId
    $progid = $script:reg.ProgId

    #取得したIDを基にブラウザ本体のパスを取得
    $script:reg=Get-ItemProperty -Path "HKCR:\$($progid)\Shell\Open\Command"
}catch{
    #アンインストールしたまま既定のブラウザを変更していない等、
    #正しく既定のブラウザが設定されていない場合はレジストリの取得に失敗するので
    #強制的にWindowsであれば絶対入っているIEで起動するためにIEのパスを取得する
    $script:reg=Get-ItemProperty -Path "HKCR:\IE.HTTP\Shell\Open\Command"
}

#レジストリに記載のパスには余計な文字やオプション文字列が付いてるので取り除く
$progdata = $script:reg."(default)"

if($progdata.substring(0,1) -contains "`""){
    #""で囲まれてる場合は""の中がパス
    $progdata -match "`"([^`"]*)`"" | Out-Null
}else{
    #""で囲まれていない場合は最初のスペースまでがパス
    $progdata -match "(\S*)" | Out-Null
}
$script:execute = $Matches[0]

#パスのファイル名を基にブラウザを判別して起動オプションを設定
foreach($browser in $browserdata) {
    if($script:execute -match $browser["command"]) {
        $script:option = $browser["option"]
        if($browser["execute"] -ne "") {
            $script:execute = $browser["execute"]
        }
        break;
    }
}

#起動
Start-Process -FilePath $script:execute -ArgumentList "$script:option $openfile"