2016-09-03 8 views
-1

Код запускается без ошибок, однако, когда я добавляю/удаляю файл в файловой системе, код не выполняет действия, которые должны выполняться в Register-ObjectEvent $watcher "watchType" -Action $action. Я знаю это, потому что в прошлом он работал и создавал/добавлял к log.txt запись о файле, удаленном/добавленном и его дате. Теперь ничего не происходит. Что происходит?PowerShell: FileSystemWatcher не работает

Код:

#local path of the folder you want to sync. By default sets to current directory 
$localPath = get-location 

#filter specific files by name/type 
$filter = "*.*" 


#include subdirectories 
$inclSubDirectories = $true 


#end of user defined variables 

$watcher = New-Object System.IO.FileSystemWatcher 
$watcher.Path = $localPath 
$watcher.Filter = $filter 
$watcher.IncludeSubdirectories = $inclSubDirectories 
$watcher.EnableRaisingEvents = $true 
$oldContent = "" 

$action = { 
    $path = $Event.SourceEventArgs.FullPath 
    $changeType = $Event.SourceEventArgs.ChangeType 

    $logline = "$(Get-Date), $changeType, $path" 
    Add-content "'$localPath'\log.txt" -value $logline 
} 

$created = Register-ObjectEvent $watcher "Created" -Action $action 

$action1 = { 
    $path = $Event.SourceEventArgs.FullPath 
    $changeType = $Event.SourceEventArgs.ChangeType 
    $logline = "$(Get-Date), $changeType, $path" 
    Add-content "'$localPath'\log.txt" -value $logline 
} 

$deleted = Register-ObjectEvent $watcher "Deleted" -Action $action1 

$exitAction = { 
    "File wathcer unregistered!" 
    Unregister-Event $created 
    Unregister-Event $deleted 
} 

$exit = Register-EngineEvent PowerShell.Exiting -action $exitAction 

while ($true) { 
    if($oldContent -eq $logline){} 
    else{ 
     $logline 
     $oldContent = $logline 
    } 
    Start-Sleep -m 1000 
} 

EDIT

Я решил попробовать скопировать и вставить код непосредственно в PowerShell, и она работает так, как надо ... Не совсем, это Безразлично 't, но он обновляет файл log.txt, как он должен. На самом деле, он работал только один раз. Теперь он вернулся к тому, как это было раньше.

EDIT v2

Это, кажется, работает только один раз в случае (создание, а затем удалить), когда я копипаст в PowerShell (например, было бы зарегистрировать файл удален в журнале, то это было бы зарегистрируйте созданный файл, но он ничего не сделает.) Он все равно не выводит, как должен.

+0

Я думаю, что 'в то время как ($ верно)' цикл полностью блокирует основной поток, в котором, как предполагается, обратные вызовы событий для запуска. Зачем тебе это? – wOxxOm

+0

@wOxxOm Я прокомментировал секцию цикла, и скрипт закроется, потому что он достиг конца скрипта. Кроме того, у меня была петля до того, когда она работала, поэтому я не думаю, что проблема. –

+0

Я по-прежнему считаю, что это неправильно, если не запуститься «Пуск-Сон-Миллисекунды 100» внутри цикла. – wOxxOm

ответ

1

Я мог видеть здесь, что ваш $localpath имеет текущий путь, и проблема возникает, когда вы делаете Add-Content.

В приведенной ниже строке путь содержит в себе singelqoutes, которого нет в любом случае.

Add-content "'$localPath'\log.txt" -value $logline

Смотрите его просто печать "'$localPath'\log.txt".

Правильное выражение будет Add-content "$localPath\log.txt" -value $logline

Как и на каждом Register-ObjectEvent выполнения, задание будет создано, попробуйте

Receive-Job -Id <Job ID> -keep, чтобы увидеть, что происходит/произошло.

С уважением

kvprasoon

+0

Я использовал Get-EventSubscriber вместо Receive-Job и увидел, что все события зарегистрированы, но он все еще не работает. Тем не менее, я решил попробовать скопировать и вставить код непосредственно в PowerShell, и он работает так, как он должен ... –