Я создаю скрипт для просмотра файлов в powershell.Я манипулировал кодом из: https://gallery.technet.microsoft.com/scriptcenter/Powershell-FileSystemWatche-dfd7084b
Казалось, что все работает нормально, но когда я провел какое-то реальное тестирование, я заметил, что событие change было вызвано только в родительском каталоге, а не в самом файле.Ниже приведен код, который я выкинул и обновил:
$folder = 'C:\extended_attributes\testing\DesignerVistaReorganize' # Enter the root path you want to monitor.
$filter = '*.*' # You can enter a wildcard filter here.
# In the following line, you can change 'IncludeSubdirectories to $true if required.
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
# Here, all three events are registerd. You need only subscribe to events that you need:
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
$filePath = -join($folder,"\",$name) | Out-String
Write-Host "The file '$filePath' was $changeType at $timeStamp" -fore green
Out-File -FilePath C:\extended_attributes\testing\outlog.txt -Append -InputObject "The file '$filePath' was $changeType at $timeStamp"}
Register-ObjectEvent $fsw Deleted -SourceIdentifier FileDeleted -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
$filePath = -join($folder,"\",$name) | Out-String
Write-Host "The file '$filePath' was $changeType at $timeStamp" -fore red
Out-File -FilePath C:\extended_attributes\testing\outlog.txt -Append -InputObject "The file '$filePath' was $changeType at $timeStamp"}
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
$filePath = -join($folder,"\",$name) | Out-String
Write-Host "The file '$filePath' was $changeType at $timeStamp" -fore white
Out-File -FilePath c:\scripts\filechange\outlog.txt -Append -InputObject "The file '$filePath' was $changeType at $timeStamp"}
События удаления и создания работают, как и следовало ожидать (как показано ниже):
Создание файла:
The file 'C:\extended_attributes\testing\DesignerVistaReorganize\Cart_Warnings\newFile.txt' Created at 10/01/2018 14:55:35
Изменение файла:
The file 'C:\extended_attributes\testing\DesignerVistaReorganize\Cart_Warnings'
было изменено 10/01/2018 15: 01: 18
Удаление файла:
The file 'C:\extended_attributes\testing\DesignerVistaReorganize\Cart_Warnings\newFile.txt' Deleted at 10/01/2018 14:56:47
Еще одна вещь, которую я заметил, это то, что событие изменения запускается только при первом изменении файла в корневом каталоге.Два других события запускаются всякий раз, когда файл создается или удаляется.Кто-нибудь сталкивался с этой проблемой раньше, и если да, то можете ли вы дать некоторое представление об обходном пути?
Work Around (хотя и не правильный ответ)
Я пробовал несколько разных вещейпытаясь заставить это событие постоянно срабатывать, и только один, кажется, работает.У меня есть два сценария для событий изменения файла.Они в значительной степени идентичны, за исключением того, что они вызывают друг друга после завершения мероприятия.Ключ не гарантирует, что вы убьете наблюдателя, отменив регистрацию события перед вызовом второго сценария.
Сценарий 1
$folder = 'C:\extended_attributes\testing\DesignerVistaReorganize' # Enter the root path you want to monitor.
$filter = '*.*' # You can enter a wildcard filter here.
# In the following line, you can change 'IncludeSubdirectories to $true if required.
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action {
echo "Script 1"
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
$filePath = -join($folder,"\",$name) | Out-String
Unregister-Event FileChanged
Write-Host "The file '$filePath' was $changeType at $timeStamp" -fore white
Out-File -FilePath C:\extended_attributes\testing\outlog.txt -Append -InputObject "The file '$filePath' was $changeType at $timeStamp"
.\change_watcher_2.ps1
}
Сценарий 2
$folder = 'C:\extended_attributes\testing\DesignerVistaReorganize' # Enter the root path you want to monitor.
$filter = '*.*' # You can enter a wildcard filter here.
# In the following line, you can change 'IncludeSubdirectories to $true if required.
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action {
echo "Script 2"
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
$filePath = -join($folder,"\",$name) | Out-String
Unregister-Event FileChanged
Write-Host "The file '$filePath' was $changeType at $timeStamp" -fore white
Out-File -FilePath C:\extended_attributes\testing\outlog.txt -Append -InputObject "The file '$filePath' was $changeType at $timeStamp"
.\change_watcher_1.ps1
}
вывод
PS C:\extended_attributes\testing> C:\extended_attributes\testing\change_watcher_1.ps1
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 FileChanged NotStarted False ...
PS C:\extended_attributes\testing> The file 'C:\extended_attributes\testing\DesignerVistaReorganize\BusinessPrinting
' was Changed at 10/02/2018 10:46:43
The file 'C:\extended_attributes\testing\DesignerVistaReorganize\Editor_Warnings
' was Changed at 10/02/2018 10:47:09
The file 'C:\extended_attributes\testing\DesignerVistaReorganize\Mobile\Mobile_Control_Panel_2015_05_14.dvf
' was Changed at 10/02/2018 10:49:50
The file 'C:\extended_attributes\testing\DesignerVistaReorganize\Mobile
' was Changed at 10/02/2018 10:49:58
The file 'C:\extended_attributes\testing\DesignerVistaReorganize\Mobile\Gradients_Panels_Colors_Menus_2015_03_01.dvf
' was Changed at 10/02/2018 10:51:49
The file 'C:\extended_attributes\testing\DesignerVistaReorganize\Mobile\Tablet_Editor_2015_03_31.dvf
' was Changed at 10/02/2018 10:52:46
The file 'C:\extended_attributes\testing\DesignerVistaReorganize\Mobile
' was Changed at 10/02/2018 10:52:57
Мне бы действительно хотелось лучшего решения, чем это, поскольку я могу предвидеть многие проблемы, возникающие из-за этого подхода.