на терминальном сервере заглючил 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 или просто Error T, то предлагается сделать так:
fsutil reparsepoint delete <file name>