Заметки · 11.04.2025

Уборка на расстоянии

Наступил долгожданный вечер пятницы! Сегодня на повестке — очистка пользовательского кэша той самой программы в стильном жёлтом интерфейсе (тык) с помощью 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
}

Разумеется, чтобы скрипты сработали корректно — лучше завершить процесс информационной системы. В случае с последним скриптом — нужно закрыть программу у всех пользователей терминальной фермы.