2016-09-03 7 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のに直接コードをコピーして貼り付けようとすることを決定し、それはそれが必要な方法を動作します... ない完全に、それはdoesnの出力するが、log.txtを更新する方法と同様に更新する。 実際、それは一度しか機能しませんでした。今は以前のようなものに戻ります。

EDIT v2の

私はPowerShellのにペーストをコピーするとき、それ、その後(例えば、それがログに削除されたファイルを登録します、(削除、その後、作成)イベントごとに一度だけ動作するようになりそうです作成されたファイルを登録しますが、それ以外は何もしません)。

+0

私は 'ながら($真)'ループは完全にブロックがイベントコールバックを想定しているメインスレッドが実行することだと思います。なぜあなたはそれが必要なのですか? – wOxxOm

+0

@wOxxOm私はループセクションをコメントアウトしました。スクリプトの終わりに達しているため、スクリプトは終了します。また、以前はループしていたので、問題はないと思っています。 –

+0

私はまだ、ループの中に少なくとも "Start-Sleep-Milliseconds 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

Receive-Jobの代わりにGet-EventSubscriberを使用し、すべてのイベントが登録されているのを確認しましたが、まだ動作していませんでした。しかし、コードを直接コピーしてPowerShellに貼り付けることにしました。 –

関連する問題