cmdlets/Clear-Cache1C.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 205 206 207 208 209 210 211 212 213 214 |
. $PSScriptRoot\CommonUtils.ps1 . $PSScriptRoot\Parse-iBases.ps1 $global:MaxSizeCache = 1MB*100 # выделять цветом папки с кэшом превышающий MaxSizeCache $global:MaxLengthName = 45 $global:MaxLengthSize = 13 $global:TotalCacheSize = 0 #---------------------------------------------------------------------------------------- # Очищает кэш 1С function Clear-Cache1C { <# .SYNOPSIS Очищает кэш платформы 1С. .DESCRIPTION Выводит пронумерованный список баз с размером кэша для каждой базы и дожидается выбора баз для очистки кэша. По умолчанию очищается только каталог кэша метаданных. Для ОС Windows C:\Users\NameUser\AppData\Local\1C\1Cv8. Параметр UserSettings позволяет очистить каталог кэша настроек пользователя. Для ОС Windows C:\Users\NameUser\AppData\Roaming\1C\1Cv8. .PARAMETER UserSettings Очистить кэш настроек пользователя. Псевдоним: us .PARAMETER Force Очистить кэш у всех баз не спрашивая. .PARAMETER Wait После выполнения дождаться нажатия любой клавиши. #> [CmdletBinding()] param( [Alias("us")][switch]$UserSettings, # работать с каталогом пользовательских настроек [switch]$Force, # True = очистить кэш метаданных у всех баз не спрашивая [switch]$Wait ) $DirCache1C = Get-DirectoryCache1C -UserSettings:$UserSettings $iBases = Get-ListBase $DirCache1C -UserSettings:$UserSettings -Force:$Force if ($Force){ # удалить кэш баз Remove-Cache1C $DirCache1C $UserSettings $iBases } else { # показать меню и дождаться выбора пользователя $Menu = "`n[1,2,3] - для очистки кэша укажите номера баз (Пустая строка = Все номера) `n"+ "[любой символ не цифра] - завершить работу`n"+ "Ваш выбор" [System.String]$InputUser = Read-Host $Menu if ($InputUser -eq '') { Remove-Cache1C $DirCache1C $UserSettings $iBases } elseif($InputUser -match '\d+') { $Indexes = Get-Indexes $InputUser if ($Indexes.Length -gt 0) { Remove-Cache1C $DirCache1C $UserSettings $iBases $Indexes } } }# if ($Force) if ($Wait) { Wait-PressAnyKey } }# end of Clear-Cache1C #---------------------------------------------------------------------------------------- # Функция каталог кэша 1С function Get-DirectoryCache1C { <# .SYNOPSIS Возвращает каталог хранения кэша платформы 1С. .DESCRIPTION По умолчанию возвращает каталог хранения кэша метаданных. Если задан параметр UserSettings, то возвращает каталог хранения кэша настроек пользователя. Если в каталоге кэша обнаружен файл location.cfg, то каталог хранения будет прочитан из файла (параметр location). По умолчанию для ОС Windows платформы 1С версии 8.3 кэш хранится в каталогах: - кэш метаданных в C:\Users\NameUser\AppData\Local\1C\1Cv8 - кэш настроек пользователя в C:\Users\NameUser\AppData\Roaming\1C\1Cv8 .PARAMETER UserSettings Вернуть каталог кэша настроек пользователя. Псевдоним: us #> [CmdletBinding()] param( [Alias("us")][switch]$UserSettings # работать с каталогом пользовательских настроек ) $ChacheDir = $env:LOCALAPPDATA + '\1C\1cv8' if ($UserSettings){$ChacheDir = $env:APPDATA + '\1C\1cv8'} if (Test-Path "$ChacheDir\location.cfg"){ switch -Regex -File "$ChacheDir\location.cfg" { "^location=(.*)$" { Write-Verbose ("location = '{0}'" -f $matches[1]) $ChacheDir = $matches[1] } } } $ChacheDir }# end Get-DirectoryCache1C #---------------------------------------------------------------------------------------- # Функция получает и выводит список баз и размер кэша каждой базы function Get-ListBase { [CmdletBinding()] param( [string]$DirCache1C, # каталог хранения кэша [Alias("us")][switch]$UserSettings, # работать с каталогом пользовательских настроек [switch]$Force # True = очистить кэш метаданных у всех баз не спрашивая ) $NameDirCache1C = "`nОчистка кэша метаданных: $DirCache1C`n" $NameTotalSize = "Суммарный размер кэша метаданных" if ($UserSettings){ $NameDirCache1C = "`nОчистка кэша настроек пользователя: $DirCache1C`n" $NameTotalSize = "Суммарный размер кэша настроек пользователя" } Write-Host $NameDirCache1C $global:TotalCacheSize = 0 $iBases = @() $i = 0 Parse-iBases | foreach{ $DirCacheBase = "{0}\{1}" -f $DirCache1C, $_.ID $CacheSize = 0 if(Test-Path -path $DirCacheBase) { $CacheSize = (dir $DirCacheBase -recurse -Force | measure -Property Length -Sum).Sum } if ([Math]::Floor($CacheSize/1mb) -gt 0){ $global:TotalCacheSize +=$CacheSize $_['Cache'] = $DirCacheBase $_['CacheSize'] = $CacheSize $iBases += $_ if (!$Force){ $msg = Get-Message $_['Name'] $CacheSize ($i+=1) if($CacheSize -ge $global:MaxSizeCache){ Write-Host $msg -ForegroundColor Yellow # покрасить строку базы } else { Write-Host $msg # вывести без окраски } }# end if (!$Force) }# if ($CacheSize -gt 0) } if (!$Force){ Write-Host (Get-Message $NameTotalSize $global:TotalCacheSize " ") -ForegroundColor White } $iBases }# end Get-ListBase #---------------------------------------------------------------------------------------- # Получает массив индексов из строки заданной пользователем function Get-Indexes($TextNumbers) { $Indexes = @() $Numbers = $TextNumbers -Replace "[\D]","," -split "," foreach($Number in $Numbers) { if ($Number.Trim() -ne '') { $Indexes += [Convert]::ToInt32($Number.Trim())-1 } } $Indexes }# end Get-Indexes #---------------------------------------------------------------------------------------- # Удаляет каталоги кэша баз данных function Remove-Cache1C($DirCache1C, $UserSettings, $Bases, $Indexes = $null) { Write-Verbose "DebugPreference = $DebugPreference" $msg = "`nОчистка кэша метаданных: $DirCache1C" if ($UserSettings){$msg = "`nОчистка кэша настроек пользователя: $DirCache1C"} Write-Host $msg -ForegroundColor White $TotalDelete = 0 if ($Indexes -eq $null){ foreach($Base in $Bases){ $TotalDelete = $TotalDelete + (Remove-CacheBase $Base) } } else { foreach($Index in $Indexes){ if ($Index -lt $Base.Length){ $TotalDelete = $TotalDelete + (Remove-CacheBase $Bases[$Index]) } } } Write-Host (Get-Message "Всего удалено:" $TotalDelete) -ForegroundColor White if ($Indexes -ne $null){ Write-Host (Get-Message "Осталось:" ($global:TotalCacheSize - $TotalDelete)) -ForegroundColor White } }# end Remove-Cache1C #---------------------------------------------------------------------------------------- # Удаляет каталоги кэша переданной базы данных function Remove-CacheBase($iBase) { $CachseSize = 0 try{ If ($DebugPreference -eq 'SilentlyContinue') { Remove-Item $iBase['Cache'] -Recurse $CachseSize = $iBase['CacheSize'] } Write-Host (Get-Message $iBase['Name'] $CachseSize) -ForegroundColor Yellow } catch [System.Exception] { # НЕ РАБОТАЕТ если файл заблокирован другим процессом!!! Write-Warning 'При удалении возникла ошибка. Возможно кэш заблокирован другим процессом или не существует.' } $CachseSize # вернем размер удаленного }# end Remove-CacheBase #---------------------------------------------------------------------------------------- # Получает строку сообщения с заданными параметрами function Get-Message($Name, $Size, $Number = $null) { if ($Number -eq $null) { $msg = "{0}.{1} MB" -f $Name.PadRight($global:MaxLengthName + 1,'.'), ("{0:n0}" -f ($Size/1mb)).PadLeft($global:MaxLengthSize,'.') } else { $msg = "{0} {1}.{2} MB" -f $Number.ToString().PadRight(2,' '), $Name.PadRight($global:MaxLengthName + 1,'.'), ("{0:n0}" -f ($Size/1mb)).PadLeft($global:MaxLengthSize,'.') } $msg }# end Get-Message |