Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1218
Благодарности: 509

Профиль | Отправить PM | Цитировать


Цитата megaloman:
А потом надо будет, чтобы окно выполнения не было видно. »
дык, это вообще не проблема же.

Цитата Busla:
зачем в PoSh все эти таймауты и задержки? - нужно просто подписаться на событие. »
Да, возможно. Это была готовая функция у меня, чуть модифицировал только... для чего создавалась, уже и не упомню.

Цитата Busla:
И грузить в память весь файл тоже не надо. Это лог, который может достигать неслабых размеров. »
Согласен, можно и построчно парсить... а если файл достаточно большой, то можно и порциями строк... не принципиально.

А вообще, тут и велосипедов изобретать не надо, уже есть изобретенные до нас...
... вот тут есть чужой скриптик, опубликую со ссылкой на автора:
скрипт watchdog.ps1
Код: Выделить весь код
<# Garry Geller
Набор функций-командлетов для наблюдения за изменениями файлов\директорий на основе
класса FileSystemWatcher. Для удобства использования можно поместить их в файл 
powershell профиля - тогда они будут доступны наравне с прочими командами сразу из
консоли, либо поместить файл модуля watchdog.ps1 в папку powershell модулей.
#>
# required -version 3.0
set-alias swatch Set-Watch 
function Set-Watch() {
<#
    .SYNOPSIS
        Запускает фоновый процесс отслеживания изменений файловой системы на основе класса FileSystemWatcher
    .DESCRIPTION
        Существующие фильтры отслеживаемых изменений:
        NotifyFilters.CreationTime
        NotifyFilters.LastAccess
        NotifyFilters.LastWrite
        NotifyFilters.FileName
        NotifyFilters.DirectoryName
        NotifyFilters.Security
        NotifyFilters.Size
        NotifyFilters.Attributes
    .EXAMPLE
        PS C:\> . .\watchdog.ps1           
        PS C:\> swatch -path "d:\test" -filter "*.txt"  -event Created,Deleted 
    .EXAMPLE    
        PS C:\> swatch -path "d:\test" -filter "*.txt"  -event Created,Deleted  -command "start-process notepad.exe" -test
    .LINK 
        https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx
    .LINK
        Remove-Watch
    .LINK
        Disable-Watch
    .LINK 
        Enable-Watch
    .LINK
        Get-Watch
#>
 
[CmdletBinding()] 
param(
    # путь до отслеживаемой директории
    [parameter(Mandatory=$true,Position=1)]
    [alias("p")][string]$path,                           
    [parameter(Mandatory=$true,Position=2)]
    # фильтр типов отслеживаемых файлов
    [alias("f")][string]$filter="*.*",                   
    # задает тип отслеживаемых изменений
    [alias("n")][string]$notify='FileName, LastWrite',   
    # нужно ли рекурсивно отслеживать субдиректории 
    [alias("r")][switch]$recurse,                        
     # событи(e|я) на котор(ое|ые) нужно реагировать
    [parameter(Mandatory=$true,Position=3)]
    [ValidateSet("Created","Deleted","Renamed","Changed")]
    [alias("e")][string[]]$events,                      
    [parameter(Mandatory=$false)]
    # строковые идентифкаторы событий
    [alias("name")][string[]]$id=@(),
    # действие которое нужно выполнить - передается одной строкой вместе с аругментами
    [string]$command,                                    
    # вывод переданных аргументов
    [switch]$test
    )
 
  
    $fsw = New-Object IO.FileSystemWatcher -Property @{
        Path = $path
        Filter = $filter
        IncludeSubdirectories = $recurse
        NotifyFilter = [IO.NotifyFilters]$notify
    }
    Set-Variable __watcher -Value $fsw -Scope Script
 
    Set-Variable command -Value $command -Scope Script
    
    $action = {
        #$command  = Get-Variable command -valueOnly -Scope Global
        $fullPath   = $event.SourceEventArgs.FullPath
        $fileName   = $event.SourceEventArgs.Name
        $changeType = $event.SourceEventArgs.ChangeType
        $timeStamp  = $event.TimeGenerated
        Write-Host "The file '$fileName' was $changeType at $timeStamp"
        
 
        if (![String]::IsNullOrEmpty($command)) {
            Invoke-Expression $command 
        }
 
    }
    
    $calls = [Collections.ArrayList]::new()
    
    for ($i=0; $i -lt $events.length; $i++) {
        
        if ($id.Length -eq $events.Length){
            $jobname = $id[$i]   
        } else {
            $jobname = $events[$i]
        }
        
        $params = @{SourceIdentifier = $jobname; Action = $action}
        if ((get-job).Name -ccontains $jobname) {
            Write-Host "Задание $jobname уже существует" -f Red
            
        } else {
            $regEvent = Register-ObjectEvent $fsw $events[$i] @params
            $calls.Add($regEvent)|Out-Null 
        }
        
    }
 
    # выводим аргументы функции
    if ($test) {
        $MyInvocation.BoundParameters.GetEnumerator() | Foreach { 
            echo "-$($_.Key): $($_.Value)"
        }
        $MyInvocation.UnboundArguments
        '----------------------------'
    }
 
    return $calls
}
 
set-alias unwatch Disable-Watch
function Disable-Watch() {
<#
    .SYNOPSIS
        Временно отключает обработку событий
    .LINK 
        Enable-Watch
    .LINK
        Remove-Watch
    .LINK
        Get-Watch
    .LINK
        Set-Watch
#>
    if ($__watcher) {
        $__watcher.EnableRaisingEvents = $false
        Write-Host "Отслеживание событий отключено" -f Yellow -b DarkGray
    }
}
 
set-alias watch Enable-Watch    
function Enable-Watch() {
<#
    .SYNOPSIS
        Включает обработку событий
    .LINK
        Disable-Watch
    .LINK
        Remove-Watch
    .LINK
        Get-Watch
    .LINK
        Set-Watch
#>    
    if ($__watcher) {
        $__watcher.EnableRaisingEvents = $true
        Write-Host "Отслеживание событий включено" -f Green -b DarkGray
    }
}
 
set-alias gwatch Get-Watch    
function Get-Watch() {
<#
    .SYNOPSIS
        Получает сторожевой объект для установки новых свойств (если указаны)
        и возвращает его 
    .EXAMPLE    
        PS C:\> (gwatch).filter = "*.*"     # установить новый файловый фильтр
        PS C:\> gwatch -Filter *.*
    .EXAMPLE    
        PS C:\> (gwatch).path= "c:\windows" # установить новую директорию для отслеживания
        PS C:\> gwatch -Path "c:\windows" 
    .EXAMPLE
        PS C:\> gwatch -NotifyFilter "Filename,LastWrite,LastAccess" -Filter "*.*"
    .EXAMPLE
        PS C:\> gwatch -IncludeSubdirectories
        PS C:\> gwatch -IncludeSubdirectories:$false
    .OUTPUTS
       FileSystemWatcher 
    .LINK
        Set-Watch
    .LINK
        Disable-Watch
    .LINK
        Remove-Watch
    .LINK
        Get-Watch 
#>    
param(
    [string]$Path,
    [string]$Filter,
    [switch][Boolean]$IncludeSubdirectories,
    [string]$NotifyFilter
 
)    
    if ($__watcher -eq $null) {
        Write-Host "Объект FileSystemWatcher не определен" -f Red
    } else { 
        
        $type_watcher = $__watcher.gettype()
        $MyInvocation.BoundParameters.GetEnumerator() | %{ 
           $key = $_.Key
           $value = $_.Value
           if ($key -eq "NotifyFilter") {
                $value = [IO.NotifyFilters]$value
           }
           if ($key -eq "IncludeSubdirectories") {
                [Boolean]$value = $value
           }
           $prop = $type_watcher.GetProperty($key)
           $prop.SetValue($__watcher, $value)
        }
        
        return $__watcher
    }
} 
 
 
set-alias rwatch Remove-Watch 
function Remove-Watch() {
<#
    .SYNOPSIS
        Удаляет задание по списку имен, либо все
    .EXAMPLE    
        PS C:\> rwatch Created,Deleted    # удалить задания по именам 
    .EXAMPLE    
        PS C:\> rwatch                    # удалить все задания
    .LINK 
        Set-Watch
#>     
    
    [CmdletBinding()]  
    param(
    [string[]]$names
    )
    if ($names.Length -eq 0) { 
        $names = (get-job).Name
    }
 
    
    
    foreach ($jobname in $names) {
        if ((get-job).Name -ccontains $jobname) {
            Unregister-Event $jobname -Force
            Remove-Job -Name $jobname -Force
            Write-Host "Задание $jobname удалено" -f Green -b DarkGray
        } else {
           Write-Host "Задание $jobname не найдено" -f Yellow -b DarkMagenta
        }
    }
    Set-Variable __watcher -Value $null -Scope Script
}

Полностью управляемый, подписывается на событие создания, изменения, удаления файлов, с возможностью ввода команд для исполнения. В общем, достаточно универсальный... удовлетворит любую потребность

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:50, 22-10-2018 | #9