Некоторые картинки не загружаются из РФ и РК, используйте VPN.

среда, 21 февраля 2024 г.

Script posh Keepass Выбор профиля Chrome

По-умолчанию двойной клик по полю url с протоколом https/http открывает новую вкладку chrome в ближайшем окне (если смотреть по порядку). При этом не важно, какой там профиль. Меня это не устраивает. Поэтому я начал искать пути решения.

Первый вариант был привязать тег keepass к папке и добавлять его как параметр --profile-directory, но оказывается я не могу использовать теги.

Следующий вариант был - получить в окне powershell список профилей из каталога %userprofile%\AppData\Local\Google\Chrome\User Data\, но тут лежат не только профили, а сами профили имеют отличные, от заданных в chrome, имена. В итоге выяснилось, что информация об именах и каталогах хранится в файле %userprofile%\AppData\Local\Google\Chrome\User Data\Local State. Это JSON файл, и, к сожалению, в одну строчку распарсить его не получится. Поэтому родился вот такой скрипт с дополнительными проверками. Скрипт выдает таблицу



где нужно ввести номер строки с профилем, этот профиль и будет загружен.

Param(
    [string]$URL
)

$LocalState="$env:LOCALAPPDATA\Google\Chrome\User Data\Local State"
$PathToChrome="\Google\Chrome\Application\chrome.exe"

if (-not (Test-Path $LocalState)) {
    Write-Host("File $LocalState not found")
    Pause
    Exit
}

$FullPathToChrome = switch($true) {
    {Test-Path -Path $env:LOCALAPPDATA$PathToChrome} {Write-Output $env:LOCALAPPDATA$PathToChrome}
    {Test-Path -Path $env:ProgramFiles$PathToChrome} {Write-Output $env:ProgramFiles$PathToChrome}
    {Test-Path -Path ${env:ProgramFiles(x86)}$PathToChrome} {Write-Output ${env:ProgramFiles(x86)}$PathToChrome}
    default {
        Write-host ("Chrome path not found")
        Pause
        exit
    }
}

$number=0 # number of profiles 
$Source=$(Get-Content -Raw $LocalState -Encoding UTF8 | ConvertFrom-Json)[0].Profile.info_cache
$arrayNameProfile=$source | Get-Member | Where MemberType -match "NoteProperty" | foreach {
    New-Object PSObject -Property @{
        Number=$number++
        AppDataProfileName=$_.Name
        BrowserProfileName=$($source."$($_.Name)").name
    }
}
$arrayNameProfile|Out-Host
    
$inputValue = 0
do {
    $inputValid = [int]::TryParse((Read-Host 'Please enter profile number'), [ref]$inputValue)
    if ( -not $inputValid ){
        Write-Host("Your input was not an integer...")
        continue
    }
    if ($inputValue -le $arrayNameProfile.Count-1){
        $selectProfile=$($arrayNameProfile[$inputValue].AppDataProfileName)
        Write-Host("$FullPathToChrome $URL --profile-directory=""$selectProfile""")
        start $FullPathToChrome "$URL --profile-directory=""$selectProfile"""
    } else {
        Write-Host("Your input is greater than the number of rows in the array...")
        $inputValid=$false
    }
} while (-not $inputValid)

В самом скрипте стоит отметить пару решений:

  • Get-Content -Raw $LocalState -Encoding UTF8 | ConvertFrom-Json
    умеет работать с кириллицей
  • [int]::TryParse((Read-Host 'Please enter profile number'), [ref]$inputValue)
    При неправильном вводе программа не завершается, а предлагает попробовать снова
  • switch($true)
    Использование switch для проверки и возвращении пути до файла chrome.exe
  • $arrayNameProfile|Out-Host
    Использование out-host для PSCustomObject. Простой вывод на экран $arrayNameProfile выведет его не сразу, а после выполнения Read-Host или всей программы
Добавляем в Keepass как обычно:
cmd://powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\script\posh\GetChromeProfile.ps1" -URL "{BASE}"
Ну или как удобнее. Было бы лучше оформить такое плагином, но мне лень это делать.

Комментариев нет:

Отправить комментарий