Загрузка данных
# =====================================================
# Скрипт автоматической установки/переустановки MSI из папок
# =====================================================
# Проверка и запрос прав администратора
if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Write-Host "Требуются права администратора. Запуск от имени администратора..." -ForegroundColor Yellow
Start-Process PowerShell -Verb RunAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`""
exit
}
Write-Host "=== АВТОМАТИЧЕСКАЯ УСТАНОВКА/ПЕРЕУСТАНОВКА ПРОГРАММ ===" -ForegroundColor Cyan
Write-Host "Запущено от имени администратора" -ForegroundColor Green
# Определяем корневую папку (где лежит скрипт)
$rootFolder = $PSScriptRoot
if (-not $rootFolder) {
$rootFolder = Get-Location
}
# Список папок и соответствующих им названий программ
$programs = @(
@{ Folder = "KPE"; Name = "Клиент АИС Налог-3 Пром версия"; InstallFolder = "Ais3Prom" }
@{ Folder = "PPK"; Name = "Клиент АИС Налог-3 ПредПром версия"; InstallFolder = "Ais3PredProm" }
@{ Folder = "KOE"; Name = "Клиент АИС Налог-3 ОЭ версия"; InstallFolder = "Ais3FB3OE" }
@{ Folder = "KOEIZ"; Name = "Клиент АИС Налог-3 ОЭ ИЗ версия"; InstallFolder = "Ais3OEIZ" }
)
# Функция поиска установленной программы через Get-Package
function Find-InstalledProgram {
param([string]$exactName)
Write-Host "Поиск программы: $exactName" -ForegroundColor Cyan
# Ищем пакет по точному имени
$foundPackage = Get-Package -Name $exactName -ErrorAction SilentlyContinue |
Select-Object -First 1
# Если не нашли по точному имени, пробуем с * (частичное совпадение)
if (-not $foundPackage) {
$foundPackage = Get-Package -Name "*$exactName*" -ErrorAction SilentlyContinue |
Select-Object -First 1
}
if ($foundPackage) {
Write-Host "Программа найдена: $($foundPackage.Name) (v$($foundPackage.Version))" -ForegroundColor Green
} else {
Write-Host "Программа не найдена" -ForegroundColor Gray
}
return $foundPackage
}
# Функция удаления программы через Uninstall-Package
function Uninstall-Program {
param(
[string]$displayName,
$package
)
Write-Host "️ Удаление программы: $displayName" -ForegroundColor Yellow
try {
# Удаляем пакет
Uninstall-Package -InputObject $package -Force -ErrorAction Stop
Write-Host "✅ Удаление успешно завершено!" -ForegroundColor Green
Start-Sleep -Seconds 3
}
catch {
Write-Host "⚠️ Ошибка при удалении: $($_.Exception.Message)" -ForegroundColor Red
}
}
# Функция установки программы
function Install-Program {
param(
[string]$msiPath,
[string]$folderName,
[string]$programName,
[string]$installFolder
)
$processToKill = "CommonComponents.Catalog.IndexationUtility"
$exeToRun = "CommonComponents.Catalog.IndexationUtility.exe"
Write-Host "Установка MSI: $msiPath" -ForegroundColor Cyan
# Запускаем установку
# /qb - прогресс бар
$installArguments = "/i `"$msiPath`" /quiet"
$installProcess = Start-Process -FilePath "msiexec.exe" -ArgumentList $installArguments -PassThru -WindowStyle Hidden
Write-Host "Установка запущена (PID: $($installProcess.Id))" -ForegroundColor Green
# Ожидание появления процесса и его завершение
$targetProcess = $null
$timeout = 1000
$elapsed = 0
Write-Host "Ожидание появления процесса $processToKill..." -ForegroundColor Cyan
while ($elapsed -lt $timeout) {
$targetProcess = Get-Process -Name $processToKill -ErrorAction SilentlyContinue
if ($targetProcess) {
Write-Host "Процесс $processToKill обнаружен!" -ForegroundColor Green
Write-Host "Завершение процесса (PID: $($targetProcess.Id))..." -ForegroundColor Yellow
Stop-Process -Id $targetProcess.Id -Force
Write-Host "Процесс завершен." -ForegroundColor Green
break
}
Start-Sleep -Seconds 2
$elapsed += 2
}
if (-not $targetProcess) {
Write-Host "Внимание: Процесс $processToKill не обнаружен" -ForegroundColor Red
}
# Ожидание завершения установки
Write-Host "Ожидание завершения установки..." -ForegroundColor Cyan
Wait-Process -Id $installProcess.Id -ErrorAction SilentlyContinue
# Сообщение об успешной установке
Write-Host "✅ Установка MSI успешно завершена!" -ForegroundColor Green
Write-Host " Установщик: $(Split-Path $msiPath -Leaf)" -ForegroundColor Green
Start-Sleep -Seconds 3
# Поиск папки с программой
Write-Host "Поиск папки с установленной программой..." -ForegroundColor Cyan
Write-Host "Ищем папку с именем $installFolder" -ForegroundColor Cyan
$programsPath = "C:\Program Files (x86)"
if(-not (Test-Path $programsPath)) {
Write-Host "Внимание: Папка $programsPath не найдена" -ForegroundColor Red
$programFolder = $null
}
else {
$programFolder = Get-ChildItem $programsPath -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq $installFolder} | Select-Object -First 1
if(-not $programFolder) {
Write-Host "Точное совпадение не найдено, ищем по частичному совпадению..." -ForegroundColor Yellow
$programFolder = Get-ChildItem $programsPath -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq "*$installFolder*" } | Select-Object -First 1
}
}
if ($programFolder) {
Write-Host "Папка программы найдена: $($programFolder.FullName)" -ForegroundColor Green
# Путь к утилите в папке Client
$exePath = Join-Path $programFolder.FullName "Client" | Join-Path -ChildPath $exeToRun
Write-Host "Ищем утилиту: $exePath" -ForegroundColor Gray
if (Test-Path $exePath) {
Write-Host " Запуск утилиты $exeToRun..." -ForegroundColor Cyan
Write-Host "Ожидание завершения утилиты..." -ForegroundColor Cyan
$utilityProcess = Start-Process -FilePath $exePath -Wait -PassThru -NoNewWindow
Write-Host "✅ Утилита завершила работу (ExitCode: $($utilityProcess.ExitCode))" -ForegroundColor Green
} else {
# Проверяем корень папки программы
$exePathRoot = Join-Path $programFolder.FullName $exeToRun
if (Test-Path $exePathRoot) {
Write-Host " Утилита найдена в корне! Запуск..." -ForegroundColor Cyan
$utilityProcess = Start-Process -FilePath $exePathRoot -Wait -PassThru -NoNewWindow
Write-Host "✅ Утилита завершила работу (ExitCode: $($utilityProcess.ExitCode))" -ForegroundColor Green
} else {
Write-Host "⚠️ Внимание: Утилита $exeToRun не найдена" -ForegroundColor Red
}
}
} else {
Write-Host "⚠️ Внимание: Папка с программой '$msiBaseName' не найдена" -ForegroundColor Yellow
}
# Итоговое сообщение для папки
Write-Host "✅ Программа '$programName' успешно установлена!" -ForegroundColor Green
Write-Host "---------------------------------------------------" -ForegroundColor Gray
}
# =====================================================
# ОСНОВНОЙ ЦИКЛ ОБРАБОТКИ ПАПОК
# =====================================================
Write-Host ""
Write-Host "=====================================================" -ForegroundColor Cyan
Write-Host "НАЧАЛО ОБРАБОТКИ ПАПОК" -ForegroundColor Cyan
Write-Host "=====================================================" -ForegroundColor Cyan
foreach ($program in $programs) {
$folderName = $program.Folder
$programName = $program.Name
$installFolder = $program.InstallFolder
Write-Host ""
Write-Host ">>> Обработка папки: $folderName <<<" -ForegroundColor Magenta
Write-Host ">>> Название программы: $programName <<<" -ForegroundColor Magenta
$folderPath = Join-Path -Path $rootFolder -ChildPath $folderName
if (-not (Test-Path $folderPath)) {
Write-Host "Предупреждение: Папка $folderPath не найдена, пропускаем" -ForegroundColor Red
continue
}
# Находим MSI файл в папке
$msiFile = Get-ChildItem -Path $folderPath -Filter "*.msi" -File | Select-Object -First 1
if (-not $msiFile) {
Write-Host "Предупреждение: В папке $folderName не найден .msi файл, пропускаем" -ForegroundColor Red
continue
}
$msiPath = $msiFile.FullName
Write-Host "Найден установщик: $($msiFile.Name)" -ForegroundColor Green
# Ищем программу по точному имени через Get-Package
$existingPackage = Find-InstalledProgram -exactName $programName
if ($existingPackage) {
Write-Host "Программа найдена. Удаляем..." -ForegroundColor Yellow
# Удаляем программу через Uninstall-Package
Uninstall-Program -displayName $existingPackage.Name -package $existingPackage
# Устанавливаем заново
Write-Host "Переустановка программы..." -ForegroundColor Cyan
Install-Program -msiPath $msiPath -folderName $folderName -programName $programName -installFolder $installFolder
} else {
Write-Host "Программа не найдена. Выполняется установка..." -ForegroundColor Green
Install-Program -msiPath $msiPath -folderName $folderName -programName $programName -installFolder $installFolder
}
}
# =====================================================
# ЗАВЕРШЕНИЕ
# =====================================================
Write-Host ""
Write-Host "=====================================================" -ForegroundColor Green
Write-Host "ОБРАБОТКА ВСЕХ ПАПОК ЗАВЕРШЕНА" -ForegroundColor Green
Write-Host "=====================================================" -ForegroundColor Green
Read-Host "Нажмите Enter для выхода"