Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Закрыть дескрипторы только на определенный каталог, но не файлы внутри (http://forum.oszone.net/showthread.php?t=347843)

MAGNIFICO 02-02-2021 22:02 2948536

Закрыть дескрипторы только на определенный каталог, но не файлы внутри
 
Доброго времени суток. Впервые обращаюсь, прошу помощи
Есть очень старая программа где происходит утечка дескрипторов, в handle отображает тысячу раз открытый каталог, и в течении 2х недель прога вылетает. Хочу автоматизировать процесс закрытия хендлов, конкретно на каталог.
в командной строке, свою программу, для примера, я обозвал explorer, и в папке MainDir есть рабочие файлы и каталоги. Задача закрыть хендлы только на директорию MainDir, но не дальше. Т.е. исключить файлы и поддиректории.
Код:

for /F "tokens=3,6 delims=: " %I IN ('handle.exe -p explorer -accepteula "C:\Documents and Settings\Admin\Desktop\MainDir"') DO handle.exe -c %J -y -p %I
Код выше закрывает все дескрипторы которые принадлежат explorer, и где в поиске встречается "C:\Documents and Settings\Admin\Desktop\MainDir".
Как сделать, чтобы всё, что после MainDir не попадало в список FOR IN в handle ?
Заранее спасибо!

Iska 02-02-2021 23:35 2948545

MAGNIFICO, Вы полагаете, если закрывать хэндлы «ручками» — она не «вылетит»?

MAGNIFICO 03-02-2021 00:16 2948551

Iska, нет, прога работает с файлами. Некоторые залочены, их то и нельзя закрывать. А только корневой каталог, я нашёл причину по которой хендлы растут, это импорт файлов. Точнее пока файл копируется, прога ожидает завершения копирования файла, и в это время дескрипторы увеличиваются, и после не закрываются, когда делаю handle -p mainProgram то у меня в основном только отображается этот каталог. Если решения не найду, буду думать через промежуточный текстовый файл: вывод в список, потом удаление строк, а после закрытие хендлов, но как это сделать пока не знаю. Курю маны)))

DJ Mogarych 03-02-2021 09:46 2948578

Handles отображаются и в powershell с помощью команды
Код:

get-process explorer |select *
Я не совсем понимаю задачу и не работал с хэндлами, но, возможно, задачу проще решить пауэршеллом без привлечения доп. программ.

MAGNIFICO 03-02-2021 13:53 2948620

Всем спасибо. Вопрос решен.
Код:

handle.exe -p explorer -accepteula "C:\Documents and Settings\Admin\Desktop\MainDir" > handle.txt
sed.exe "/MainDir\\/d" handle.txt > hresult.txt
for /F "tokens=3,6 delims=: " %%I IN (hresult.txt) DO handle.exe -c %%J -y -p %%I


greg zakharov 03-02-2021 15:27 2948645

Цитата:

Цитата DJ Mogarych
get-process explorer | select *

Дескрипторы (handles) и общая сводка по процессу суть полярные вещи. Дескрипторы никак иначе окромя сторонних модулей не получить, раз, в зависимости от версии pwsh, хост может падать, два (так как для "расшифровки" данных запрашивающий процесс должен выполнять дублирование дескриптора).
Цитата:

Цитата MAGNIFICO
Всем спасибо. Вопрос решен.

Имея на руках sed всё можно уместить в одну команду. Во-вторых, у handle есть дурная склонность "зомбифицировать" некоторые потоки.

MAGNIFICO 03-02-2021 16:29 2948656

greg zakharov, под линуксом да, там удобнее). А тут XP - я не сильно заморачиваюсь. В общем одни костыли на работе)) само копирует, само конвертирует, сортирует, перекладывает))

alpap 03-02-2021 17:38 2948667

MAGNIFICO,
если все правильно. уберите вывод в файл и команду echo в выводе for
Код:

@echo off
for /f "tokens=1,4* delims=: " %%a in ('handle -p "explorer.exe"^|sed -n "/C:\\Documents and Settings\\Admin\\Desktop\\MainDir\\[^\]/p"') do echo handle.exe -c %%a -y -p %%b:%%c >> handle.txt
pause


greg zakharov 03-02-2021 17:42 2948668

alpap, там и цикл не нужен: вывод sed просто передать далее по конвейеру cmd /c + "команда".

alpap 03-02-2021 18:19 2948676

Цитата:

Цитата greg zakharov
вывод sed просто передать »

может быть, не пробовал, но скорее всего надо фильтровать под утилиту под ключи: -c и -p, колонок там немало и пути с пробелами не отделены.

greg zakharov 03-02-2021 18:24 2948678

Фильтровать ничего не нужно, достаточно изменить представление выводимого потока. Это ж sed.


Время: 03:42.

Время: 03:42.
© OSzone.net 2001-