コードはエラーなしで実行されますが、ファイルシステムにファイルを追加/削除すると、コードは実行されません。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のにペーストをコピーするとき、それ、その後(例えば、それがログに削除されたファイルを登録します、(削除、その後、作成)イベントごとに一度だけ動作するようになりそうです作成されたファイルを登録しますが、それ以外は何もしません)。
私は 'ながら($真)'ループは完全にブロックがイベントコールバックを想定しているメインスレッドが実行することだと思います。なぜあなたはそれが必要なのですか? – wOxxOm
@wOxxOm私はループセクションをコメントアウトしました。スクリプトの終わりに達しているため、スクリプトは終了します。また、以前はループしていたので、問題はないと思っています。 –
私はまだ、ループの中に少なくとも "Start-Sleep-Milliseconds 100"がなければ間違っていると思います。 – wOxxOm