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

надеюсь, этот фильтр кому-нибудь сгодится ещё :)

Saturday, September 05, 2009 10:46:15 PM (FLE Daylight Time, UTC+03:00)   Comments [0]    

 

 · 

All content © 2008 - 2012, Vadims Podāns
"Spaces" Theme provided by: Vadims Podāns
About


E-mail - Send mail to the author(s)
Live Messenger -
For english language visitors
Библиотека
Календарик
<February 2012>
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

Карта расположения посетителей
Favorites





Disclaimer
Вся информация на сайте предоставляется на условиях «как есть», без предоставления каких-либо гарантий и прав.

При использовании материалов c данного сайта ссылка на оригинальный источник обязательна.
Protected by Copyscape Online Plagiarism Scanner