Наступил долгожданный вечер пятницы! Сегодня на повестке — очистка пользовательского кэша той самой программы в стильном жёлтом интерфейсе (тык) с помощью PowerShell на удалённых хостах в домене.
Первый скрипт зачищает папки с кэшем у всех пользователей удалённого компьютера. Я специально не стал навешивать на скрипт условие с проверкой доступности хоста. Предполагается, что администратор абсолютно уверен в доступности, как сетевого пути, так и компьютера в целом.
$title = "Очистка кэша 1С"
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
[System.Console]::Title = "$title"
while($true)
{
$remotehost = Read-Host "Удалённый хост"
Get-ChildItem "\\$remotehost\C$\Users\*\AppData\Local\1C\1Cv8\*",`
"\\$remotehost\C$\Users\*\AppData\Roaming\1C\1Cv8\*" | `
Where {$_.Name -as [guid]} | `
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
}
Конструкция спрашивает имя компьютера, удаляет папки с кэшем, а потом снова выпытывает имя очередного компа. Неоднократно проверенный и надёжный скрипт, построенный на конвейере из командлетов Get-ChildItem и Remove-Item. Обращаю Ваше внимание на фильтрацию папок по guid-имени с помощью конструкции Where {$_.Name -as [guid]}.
А что делать, если пользователь с проблемным кэшем находится на терминальной ферме? Если учесть, что в состав терминальной фермы входят три узла сеансов, то можно пройтись перебором по всем трём серверам в поисках нужного профиля пользователя. Скрипт спросит имя пользователя, а дальше — дело техники.
$title = "Очистка кэша 1С на терминальной ферме"
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
[System.Console]::Title = "$title"
# Переменная с именем пользователя #
$rdsuser = Read-Host "Имя пользователя"
# Переменная с массивом серверов #
$servers = @("RDS01", "RDS02", "RDS03")
foreach ($server in $servers)
{
Get-ChildItem "\\$server\C$\Users\$rdsuser\AppData\Local\1C\1Cv8\*",`
"\\$server\C$\Users\$rdsuser\AppData\Roaming\1C\1Cv8\*" | `
Where {$_.Name -as [guid]} | `
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
}
Так можно почистить кэш у всех пользователей терминальной фермы на всех трёх узлах сеансов, при условии, что профили доступны:
$title = "Очистка кэша 1С у всех пользователей фермы"
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
[System.Console]::Title = "$title"
# Переменная с массивом серверов #
$servers = @("RDS01", "RDS02", "RDS03")
foreach ($server in $servers)
{
Get-ChildItem "\\$server\C$\Users\*\AppData\Local\1C\1Cv8\*",`
"\\$server\C$\Users\*\AppData\Roaming\1C\1Cv8\*" | `
Where {$_.Name -as [guid]} | `
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
}
Разумеется, чтобы скрипты сработали корректно — лучше завершить процесс информационной системы. В случае с последним скриптом — нужно закрыть программу у всех пользователей терминальной фермы.