【问题标题】:PowerShell: FileSystemWatcher not workingPowerShell:FileSystemWatcher 不工作
【发布时间】:2025-12-16 16:20:30
【问题描述】:

代码运行没有错误,但是当我在文件系统中添加/删除文件时,代码没有执行它应该在Register-ObjectEvent $watcher "watchType" -Action $action 中执行的操作。我知道这一点,因为在过去,它正在工作并且会创建/添加到log.txt 删除/添加的文件及其日期的记录。现在,什么也没有发生。怎么回事?

代码:

#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
}

编辑

我决定尝试将代码直接复制并粘贴到 PowerShell 中,它按应有的方式工作... 不完全是,它不会输出,但会像它应该的那样更新 log.txt。 实际上,它只工作过一次。现在又变回原来的样子了。

编辑 v2

当我将复制粘贴到 PowerShell 时,每个事件(创建,然后删除)似乎只工作一次(例如,它会注册一个在日志中删除的文件,然后它会注册一个创建的文件,但它不会t 做任何其他事情。)它仍然没有像应有的那样输出。

【问题讨论】:

  • 我认为while ($true) 循环完全阻塞了应该运行事件回调的主线程。为什么需要它?
  • @wOxxOm 我注释掉了循环部分,脚本将关闭,因为它已经到达脚本的末尾。另外,我之前在它工作时有一个循环,所以我认为这不是问题。
  • 我仍然认为在循环中没有至少Start-Sleep -Milliseconds 100 是错误的。
  • @wOxxOm 我添加了它,但它仍然没有工作。感谢您的帮助。

标签: powershell filesystemwatcher


【解决方案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

【讨论】:

  • 我使用 Get-EventSubscriber 而不是 Receive-Job 并看到所有事件都已注册,但它仍然无法正常工作。但是,我决定尝试将代码直接复制并粘贴到 PowerShell 中,它的工作方式应该是……