File Watcher с использованием Windows Powershell для мониторинга нескольких путей

Я создаю сценарий Powershell File Watcher для мониторинга нескольких путей. Мне нужно отслеживать около 6 путей, используя один и тот же скрипт File Watcher. Я видел в сети пример скрипта («Powershell FileSystemWatcher для нескольких путей») и создал скрипт. Следуя коду скрипта:

$i=0 

# list of path of the monitored folders. 

$paths = Get-Content "D:\abc\Folder_monitored_paths.txt"; 

foreach ($path in $paths)  
{ 

$filter = '*.*'   

$fsw = New-Object IO.FileSystemWatcher $path -Property @{IncludeSubdirectories = $true} 

Register-ObjectEvent $fsw Created -SourceIdentifier "$i+folderCreated" -Action { 

$name = $Event.SourceEventArgs.Name 
$changeType = $Event.SourceEventArgs.ChangeType 
$fpath = $Event.SourceEventArgs.FullPath 
$timeStamp = $Event.TimeGenerated 

$logline = "$(Get-Date), $changeType, $fpath, $name"
Add-content "D:\log.txt" -value $logline 


}

$i = $i+1 

}

Я разместил около 3 путей в: $paths = Get-Content "D:\abc\Folder_monitored_paths.txt";

При выполнении кода происходит следующее: командная строка немедленно возвращается на экран вывода. После этого, когда я размещаю файлы по всем трем путям, он регистрирует запись для всех трех каталогов. При втором запуске, когда я снова помещаю файлы в каталоги, в файле журнала не регистрируется никакой записи. Почему это происходит ? Почему он не регистрирует записи во второй раз, а также почему командная строка сразу же возвращается обратно? Я что-то пропустил/не так в коде?

Не имея никакой подсказки к моим вышеуказанным 2 запросам. Пожалуйста, помогите.


person user10675448    schedule 20.11.2018    source источник
comment
Что ты хочешь этим сказать? «При втором запуске», если вы не отменили регистрацию исходного события, оно все еще выполняется. Get-EventSubscriber-Force | Unregister-Event -Force При тестировании того, что у вас есть здесь, это работает, из того, что я пробовал здесь, как и ожидалось, если вы удалите предыдущую регистрацию, прежде чем устанавливать ее снова.   -  person postanote    schedule 21.11.2018
comment
Под «вторым запуском» я подразумеваю, что когда я размещаю файл во второй раз, т.е. второй файл в каждом месте .... Это не регистрирует событие в файле log.txt. Также еще одно наблюдение, если log.txt отсутствует в местоположении ... тогда он не создает его. Также почему командная строка сразу возвращается обратно и не ждет. Основная цель по-прежнему остается, что я должен следить за всем 6 путей с одним и тем же скриптом FileWatcher....посоветуйте.   -  person user10675448    schedule 21.11.2018
comment
Это не то, что я получаю на своей стороне, я мог бы опубликовать эти результаты, чтобы показать вам. Подсказка должна вернуться, так как это фоновая вещь, что позволяет вам выполнять другую работу. Если вы хотите знать, что событие все еще активно, просто найдите его --- Get-EventSubscriber -Force | Формат-Таблица-AutoSize   -  person postanote    schedule 22.11.2018


Ответы (1)


Для ОП на основе моего последнего комментария.

$i=0 

# list of path of the monitored folders. 

$paths = Get-Content "D:\temp\Folder_monitored_paths.txt" 

foreach ($path in $paths)  
{ 
    $filter = '*.*'   

    $fsw = New-Object IO.FileSystemWatcher $path -Property @{IncludeSubdirectories = $true} 

    Register-ObjectEvent $fsw Created -SourceIdentifier "$i+folderCreated" `
    -Action { 
                $name = $Event.SourceEventArgs.Name 
                $changeType = $Event.SourceEventArgs.ChangeType 
                $fpath = $Event.SourceEventArgs.FullPath 
                $timeStamp = $Event.TimeGenerated 

                $logline = "$(Get-Date), $changeType, $fpath, $name"
                Add-content "D:\temp\log.txt" -value $logline 
            }

    $i = $i+1 
}

<#
Id     Name            PSJobTypeName   State         HasMoreData     Location             Command                  
--     ----            -------------   -----         -----------     --------             -------                  
1      0+folderCreated                 NotStarted    False                                 ...                     
2      1+folderCreated                 NotStarted    False                                 ...                     
3      2+folderCreated                 NotStarted    False                                 ... 
#>


Get-EventSubscriber -Force | Format-Table -AutoSize
<#
SubscriptionId SourceObject                EventName SourceIdentifier Action                                  HandlerDelegate SupportEvent ForwardEvent
-------------- ------------                --------- ---------------- ------                                  --------------- ------------ ------------
             1 System.IO.FileSystemWatcher Created   0+folderCreated  System.Management.Automation.PSEventJob                        False        False
             2 System.IO.FileSystemWatcher Created   1+folderCreated  System.Management.Automation.PSEventJob                        False        False
             3 System.IO.FileSystemWatcher Created   2+folderCreated  System.Management.Automation.PSEventJob                        False        False
#>

<#
11/20/2018 17:10:31, Created, d:\temp\abcpath0\New Text Document.txt, New Text Document.txt
11/20/2018 17:10:42, Created, d:\temp\abcpath1\New Text Document.txt, New Text Document.txt
11/20/2018 17:10:47, Created, d:\temp\abcpath2\New Text Document.txt, New Text Document.txt
11/20/2018 17:11:08, Created, d:\temp\abcpath0\New folder, New folder
11/20/2018 17:11:13, Created, d:\temp\abcpath1\New folder, New folder
11/20/2018 17:11:18, Created, d:\temp\abcpath2\New folder, New folder
11/20/2018 17:12:29, Created, d:\temp\abcpath0\New folder\New Text Document.txt, New folder\New Text Document.txt
11/20/2018 17:12:34, Created, d:\temp\abcpath1\New folder\New Text Document.txt, New folder\New Text Document.txt
11/20/2018 17:12:41, Created, d:\temp\abcpath2\New folder\New Text Document.txt, New folder\New Text Document.txt
11/20/2018 17:12:46, Created, d:\temp\abcpath0\New folder\New folder, New folder\New folder
11/20/2018 17:12:52, Created, d:\temp\abcpath1\New folder\New folder, New folder\New folder
11/20/2018 17:13:00, Created, d:\temp\abcpath2\New folder\New folder, New folder\New folder
11/20/2018 17:13:29, Created, d:\temp\abcpath0\New Rich Text Document.rtf, New Rich Text Document.rtf
11/20/2018 17:13:42, Created, d:\temp\abcpath1\New Rich Text Document.rtf, New Rich Text Document.rtf
11/20/2018 17:13:47, Created, d:\temp\abcpath2\New Rich Text Document.rtf, New Rich Text Document.rtf
11/21/2018 17:52:39, Created, d:\temp\abcpath0\New Microsoft Excel Worksheet.xlsx, New Microsoft Excel Worksheet.xlsx
11/21/2018 17:52:39, Created, d:\temp\abcpath0\~ew Microsoft Excel Worksheet.tmp, ~ew Microsoft Excel Worksheet.tmp
11/21/2018 17:52:39, Created, d:\temp\abcpath0\New Microsoft Excel Worksheet.xlsx~RF82e46c.TMP, New Microsoft Excel Worksheet.xlsx~RF82e46c.TMP
11/21/2018 17:52:45, Created, d:\temp\abcpath1\New Microsoft Excel Worksheet.xlsx, New Microsoft Excel Worksheet.xlsx
11/21/2018 17:52:48, Created, d:\temp\abcpath2\New Microsoft Excel Worksheet.xlsx, New Microsoft Excel Worksheet.xlsx
11/21/2018 17:52:56, Created, d:\temp\abcpath2\New Bitmap Image.bmp, New Bitmap Image.bmp
11/21/2018 17:53:03, Created, d:\temp\abcpath1\New Bitmap Image.bmp, New Bitmap Image.bmp
11/21/2018 17:53:05, Created, d:\temp\abcpath0\New Bitmap Image.bmp, New Bitmap Image.bmp
#>

Get-EventSubscriber -Force | Unregister-Event -Force
person postanote    schedule 22.11.2018
comment
Спасибо postanote... на самом деле я перезапустил скрипт и он решил проблему. Почему-то создавалось впечатление, что он не опрашивает 3 папки. Я также понимаю, что подсказка возвращается из-за фоновой проблемы. Спасибо еще раз. - person user10675448; 26.11.2018