Этим пятничным вечером речь пойдёт про замечательную программу 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» в директории был один.
Напоминаю, что программа будет установлена по стандартному пути, согласно атрибутам установки и битности. И, разумеется, не меняйте имя установочного файла программы, иначе получите вот такую ошибку:
