Иногда бывает необходимость проверить, заблокирован ли файл каким-то приложением в монопольном режиме, прежде чем совершать какое-то действие над ним. Например, мой скрипт Get-PsFCIV.ps1 очень сильно ругается краснотой, если файл заблокирован, т.к. System.IO.StreamReader, который у меня используется для подсчёта хешей файлов требует, чтобы файл никем не был занят. Принцип проверки файла заключается в том, что мы пробуем получить доступ к файлу через System.IO.StreamReader и если это нам не удалось, значит файл заблокирован. Вот и решил написать такой удобный фильтр, который можно использовать и отдельно, просто для проверки блокировки файлов:
filter Test-FileLock { # проверяем, откуда пришли данные - из конвейера или через аргументы фильтра # и создаём объекты текущего элемента if ($args[0]) {$filepath = gi $(Resolve-Path $args[0]) -Force} else {$filepath = gi $_.fullname -Force} # отфильтровываем папки if ($filepath.psiscontainer) {return} # задаём переменную $locked в исходное значение $false $locked = $false # создаём ловушку для ошибки доступа. Если ловушка сработает, то переменная # $locked выставляется в $true, что будет означать, что файл заблокирован # в монопольном режиме каким-то приложением trap { Set-Variable -name locked -value $true -scope 1 continue } # открываем файл в режиме read/write. Если файл заблокирован, то ошибка будет # поймана ловушкой $inputStream = New-Object system.IO.StreamReader $filepath # если файл не был заблокирован, то закрываем StreamReader if ($inputStream) {$inputStream.Close()} # выводим результаты на экран в виде хеш-таблицы @{$filepath = $locked} }
фильтр можно запускать как с аргументами, так и в конвейере:
[↓] [vPodans] Test-FileLock ntuser.dat Name Value ---- ----- C:\Users\vPodans\ntuser.dat True [↓] [vPodans] Test-FileLock ntuser.ini Name Value ---- ----- C:\Users\vPodans\ntuser.ini False [↓] [vPodans] dir ntuser.dat -Force | Test-FileLock Name Value ---- ----- C:\Users\vPodans\ntuser.dat True [↓] [vPodans] dir ntuser.ini -Force | Test-FileLock Name Value ---- ----- C:\Users\vPodans\ntuser.ini False [↓] [vPodans]
надеюсь, этот фильтр кому-нибудь сгодится ещё :-)
Comments: