PowerShell · 16.02.2024

От Sumatra с приветом

Этим пятничным вечером речь пойдёт про замечательную программу Sumatra PDF и в частности про скачивание свежей версии и её установку с помощью PowerShell. Ну, и ещё немного про настройку, но…

Сначала скрипт, с помощью которого можно скачать и установить последнюю версию программы, а уже потом обо всём и по порядку:

[System.Console]::Title = "Установка Sumatra PDF"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$site = "https://www.sumatrapdfreader.org"
$dpage = "https://www.sumatrapdfreader.org/download-free-pdf-viewer"
$desktop = [Environment]::GetFolderPath("Desktop")
$64 = (Invoke-WebRequest -Uri $dpage -UseBasicParsing).Links.href `
        | Select-String -Pattern "64-install.exe" `
        | Select-String -Pattern "arm64" -NotMatch
$32 = (Invoke-WebRequest -Uri $dpage -UseBasicParsing).Links.href `
        | Select-String -Pattern "-install.exe" `
        | Select-String -Pattern "64" -NotMatch
$arch = [Environment]::Is64BitOperatingSystem
$params = '-all-users -s'
if ($arch) 
{ 
    $link = $site+$64
    $filename = ([uri]$link).Segments[-1]
    Start-BitsTransfer -Source $link -Destination $desktop\$filename
}
else
{ 
    $link = $site+$32
    $filename = ([uri]$link).Segments[-1]
    Start-BitsTransfer -Source $link -Destination $desktop\$filename
}
try 
{ 
    Write-Host "Установка SumatraPDF..." -ForegroundColor Green
    Start-Process -FilePath $desktop\$filename -ArgumentList $params -ErrorAction Stop -Wait
    Remove-Item -Path $desktop\$filename -Force
}
catch
{ 
    Write-Host "Ошибка установки SumatraPDF!" -ForegroundColor Red
    Sleep(10)
}

Код выше парсит эту страничку и отбирает ссылки, передавая их в командлет Start-BitsTransfer для последующего скачивания.

Как только скачивание будет завершено — скрипт запускает процесс установки. Установка будет производится от имени администратора, соответственно запуск скрипта тоже должен быть осуществлён с повышенными правами. Я намеренно не стал перегружать скрипт комментариями, так как его общий функционал вполне понятен.

Ну, а теперь самое любопытное: если Вы используете Sumatra PDF, то, вероятно, обращали внимание, что программа запоминает все открытые файлы и при очередном старте восстанавливает историю вкладок. Разумеется, если до закрытия программы был открыт целый ряд и без того тяжёлых pdf — загрузка программы займёт какое-то время.

Бороться с этим можно с помощью стандартного окна настроек программы, дождавшись загрузки всех вкладок и уже потом отключив соответствующую опцию. А что делать, если ждать окончания загрузки программы уже нет ни времени, ни сил, ни желания? Особенно, если речь идёт об удалённом хосте?

Для этих целей в моём арсенале появилась эта функция:

function SumatraSettings
{
    Param([Parameter(Mandatory=$true)]$ComputerName,
          [Parameter(Mandatory=$true)]$UserName)
    $dir = "\\$ComputerName\C$\Users\$UserName\AppData\Local\SumatraPDF"
    $settings = "SumatraPDF-settings.txt"
    $file = Get-ChildItem -Path $dir -Filter $settings -Recurse
    Copy-Item -Path ($file).FullName -Destination $dir\$settings".bak"
    (Get-Content ($file).FullName) -replace 'RememberOpenedFiles = true', 'RememberOpenedFiles = false' | Set-Content ($file).FullName
}

SumatraSettings открывает файл настроек программы Sumatra PDF в профиле пользователя и изменяет значение опции RememberOpenedFiles с true на false. В качестве параметров функция принимает имена компьютера и пользователя. Чуть не забыл: функция делает копию файла настроек программы на случай, если вдруг что-то пойдёт не так.

В вызове функции нет никаких сложностей или особых тонкостей. Всё вполне предсказуемо:

SumatraSettings -ComputerName PC -UserName User

А если в Ваших краях дистрибутивы хранятся в сетевой папке и производится централизованная скриптовая установка на машины, попробуйте этот метод:

$sumatra = (Get-ChildItem \\server\distrib -Filter *sumatra*).FullName
$params = '-all-users -s'
try
{
  Write-Host "Установка..." -ForegroundColor Green
  Start-Process -FilePath $sumatra -ArgumentList $params -ErrorAction Stop
}
catch
{
  Write-Host "Ошибка установки!" -ForegroundColor Red
}

Главное, чтобы установочный файл с ключевым словом «sumatra» в директории был один.

Напоминаю, что программа будет установлена по стандартному пути, согласно атрибутам установки и битности. И, разумеется, не меняйте имя установочного файла программы, иначе получите вот такую ошибку: