Иногда бывает необходимость проверить, заблокирован ли файл каким-то приложением в монопольном режиме, прежде чем совершать какое-то действие над ним. Например, мой скрипт 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]
надеюсь, этот фильтр кому-нибудь сгодится ещё 