Загрузка данных


# =====================================================

# Скрипт автоматической установки/переустановки 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 для выхода"