Проблема
на терминальном сервере заглючил Citrix Profile Manager и остались открытыми кучи file handlers в профилях пользователей. Завершить процесс Citrix Profile Manager безболезненно нельзя, но файлы с зависшими file handlers удалить необходимо.
С помощью Process Explorer можно закрывать по одному хендлеру, но если их много сотен, то это не выход.
Решение
У Sysinternals есть утилита Handle.
Утащил к себе: handle.zip
Эта утилитка предоставляет интерфейс командной строки к функционалу Process Explorer.
Копируем handle.exe в c:\windows\system32.
Для закрытия всех хендлеров в заданной папке в командной строке с правами администратора выполняем:
for /f "tokens=3,6,8 delims=: " %i in ('handle e:\folder_name\') do echo Releasing %k & handle -c %j -y -p %i
Также можно добавить фильтр по имени процесса (указав в вызове handle -p processname):
for /f "tokens=3,6,8 delims=: " %i in ('handle -p eclipse e:\git\') do echo Releasing %k & handle -c %j -y -p %i
Если добавить в систему grep.exe из GnuWin32, то можно закрывать хендлеры только определенного типа файлов:
for /f "tokens=3,6,8 delims=: " %i in ('handle -p eclipse e:\git\ ^| grep .xml') do echo Releasing %k & handle -c %j -y -p %i
Хотя последний вариант можно исполнить и без grep, заменив его на виндовый find.
for /f "tokens=3,6,8 delims=: " %i in ('handle c:\users\ ^| find "AppData\Local\" ^| find ".tmp"') do echo Releasing %k & handle -c %j -y -p %i
Чтобы быстрее закрывать эти хендлы если их много можно использовать start перед последним вызовом handle. В этом случае скрипт не будет дожидаться закрытия handle каждый раз.
Если handle is invalid
Если при закрытии хендла появляются сообщения типа Handle is invalid или просто Error T, то предлагается сделать так:
fsutil reparsepoint delete <file name>
Discussion