По-умолчанию двойной клик по полю 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 или всей программы
cmd://powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\script\posh\GetChromeProfile.ps1" -URL "{BASE}"
Комментариев нет:
Отправить комментарий