cmdlets/Uninstall-1C.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
#09.2017©willynilly . $PSScriptRoot\CommonUtils\CommonUtils.ps1 #---------------------------------------------------------------------------------------- # Запускает деинсталяцию установленных экземпляров 1С function Uninstall-1C { <# .SYNOPSIS Деинсталирует не используемые версии платформы 1С. .DESCRIPTION Деинсталирует все установленые стандартным установщиком версии платформы 1С кроме: - заданных по умолчанию в файле iBases.v8i из профиля текущего пользователя - запущенных на момент выполнения скрипта После запуска команды выводится список всех установленных платформ для удаления (список исключений выделен цветом) и ожидается подтверждение пользователя на удаление. .PARAMETER Force Выполнить деинсталяцию без вопросов пользвователю. .PARAMETER Wait Для завершения работы ждать подтверждения от пользователя. #> [CmdletBinding()] param( [switch]$Wait, # Ожидать нажатия любой клавиши (параметр переключатель) [switch]$Force # молча выполнить без вопросов пользователю (параметр переключатель) ) $DickUsedBefore = (Get-PSDrive -Name C).Used # занято на диске до начала деинсталяции $TotalWatch = [System.Diagnostics.Stopwatch]::StartNew() # глобальный секундомер $Watch = [System.Diagnostics.Stopwatch]::StartNew() # секундомер для операции $TotalWatch.Start() #Запуск глобального секундомера # получим список ислючений из удаления $Watch.Reset() $Watch.Start() $ExceptPlatform = Get-ExceptPlatform $Watch.Stop() $TimeGetExcept = $Watch.Elapsed # Получим все приложения вендора $Watch.Reset() $Watch.Start() $InstalledPlatform = Get-InstalledPlatform $Watch.Stop() $TimeGetting = $Watch.Elapsed # Покажем что получили $HasRemove = Show-ListToUninstall $InstalledPlatform $ExceptPlatform # Запрос на продолжение if (-not($Force)) { $TotalWatch.Stop() #Тормознем глобальный секундомер (пропустим раздумья пользователя) $CanContinue = Get-Permission $TotalWatch.Start() } #Запустить деинсталяцию $DickFree = 0 $Watch.Reset() if ($HasRemove -and $CanContinue) { $Watch.Start() Run-Uninstall $InstalledPlatform $ExceptPlatform $Watch.Stop() $DickFree = $DickUsedBefore - (Get-PSDrive -Name C).Used # высвобождено после деинсталяции } $TimeUninstall = $Watch.Elapsed #Подведем итоги работы '' $TotalWatch.Stop() #Остановка глобального секундомера $MaxRight = 50 $MaxLeft = 12 $Sym = '.' $TimeFormat = '{0:hh}:{0:mm}:{0:ss}.{0:fff}' ("Затрачено на получение списка установленных").PadRight($MaxRight,$Sym) + $TimeFormat -f $TimeGetting ("Затрачено на получение списка исключений").PadRight($MaxRight,$Sym) + $TimeFormat -f $TimeGetExcept ("Количество установленных экземпляров").PadRight($MaxRight,$Sym) + ('{0}' -f $InstalledPlatform.Count).PadLeft($MaxLeft, $Sym) ("Количество исключений").PadRight($MaxRight,$Sym) + ('{0}' -f $ExceptPlatform.Count).PadLeft($MaxLeft, $Sym) ("Затрачено на деинсталяцию").PadRight($MaxRight,$Sym) + $TimeFormat -f $TimeUninstall ("Всего высвобождено на диске").PadRight($MaxRight,$Sym) + ('{0:n3} Gb' -f ($DickFree/1Gb)).PadLeft($MaxLeft, $Sym) ("Всего затрачено:").PadRight($MaxRight,$Sym) + $TimeFormat -f $TotalWatch.Elapsed if ($Wait) { Wait-PressAnyKey } }# end Uninstall-1C #---------------------------------------------------------------------------------------- # Удаляет платформы из переданного списка установленных кроме списка исключений если задан function Run-Uninstall($InstalledPlatform, $ExceptPlatform = $null) { Write-Host "`nУдаленные:" foreach($Platform in $InstalledPlatform) { if (Can-UninstallVersion $Platform.Version $ExceptPlatform) { Write-Host (" {0}" -f $Platform.Name) -ForegroundColor Green $Platform.Uninstall() | Out-Null } } }# end Run-Uninstall #---------------------------------------------------------------------------------------- # Показывает список к удалению но не удаляет function Show-ListToUninstall($InstalledPlatform, $ExceptPlatform = $null) { Write-Host "`nСписок к удалению:" $HasRemove = $false foreach($Platform in $InstalledPlatform) { if (Can-UninstallVersion $Platform.Version $ExceptPlatform) { Write-Host (" {0}" -f $Platform.Name) -ForegroundColor Green $HasRemove = $true } else {Write-Host (" {0}" -f $Platform.Name) -ForegroundColor Yellow} } return $HasRemove }# end Show-ListToUninstall #---------------------------------------------------------------------------------------- # Проверяет возможность удаления function Can-UninstallVersion($Version, $ExceptPlatform = $null) { $Results = $True if ($ExceptPlatform -ne $null) { $Results = -not($ExceptPlatform.ContainsKey($Platform.Version)) } return $Results }# end Can-UninstallVersion #---------------------------------------------------------------------------------------- # получает версии установленных платформ function Get-InstalledPlatform { $VendorEN = "1C" $VendorRU = "1С" $FilterVendor = "(Vendor like '{0}%' or Vendor like '{1}%')" -f $VendorEN, $VendorRU $FilterName = "(Name like '{0}%' or Name like '{1}%')" -f ($VendorEN + ":Предприятие"), ($VendorRU + ":Предприятие") $Filter = "{0} and {1}" -f $FilterVendor, $FilterName $InstalledPlatform = Get-WmiObject -Class Win32_Product -Filter $Filter -ComputerName "." | Sort-Object Version, Name return $InstalledPlatform }# end Get-InstalledPlatform #---------------------------------------------------------------------------------------- # получает версии платформ запрещенных для удаления function Get-ExceptPlatform { # соберем все что удалять не надо Write-Host "`nСписок исключений для удаления получен:" $ExceptPlatform = @{} Add-1CEStart_cfg $ExceptPlatform Add-StartedProcess1C $ExceptPlatform Write-Host '' $ExceptPlatform.Keys | sort | foreach{Write-Host(' {0}' -f $_) -ForegroundColor Yellow} return $ExceptPlatform }# end Get-ExceptPlatform #---------------------------------------------------------------------------------------- # добавляет версии платформ перечисленные в файле 1CEStart.cfg из профиля пользователя function Add-1CEStart_cfg($ExceptPlatform) { $Ok = $false $fpathEStartCfg = $env:appdata + "\1C\1CEStart\1CEStart.cfg" if(Test-Path $fpathEStartCfg) { Get-Content $fpathEStartCfg | where {$_ -match 'DefaultVersion'} | foreach { $Platform = ($_ -split '-')[1] $Platform = ($Platform -split ';')[0] $ExceptPlatform[$Platform]=""; $Ok = $true } if ($Ok){Write-Host (" - из файла {0}" -f $fpathEStartCfg)} } }# end Add-1CEStart_cfg #---------------------------------------------------------------------------------------- # добавляет версии платформ всех запущенных в текущий момент процессов function Add-StartedProcess1C($ExceptPlatform) { $Ok = $false Get-Process "1cv8*" -FileVersionInfo | foreach{$ExceptPlatform[$_.FileVersion]=""; $Ok = $true} Get-Process "ragent*" -FileVersionInfo | foreach{$ExceptPlatform[$_.FileVersion]=""; $Ok = $true} if ($Ok){Write-Host " - из списка запущеных процессов"} }# end Add-StartedProcess1C |