如何使用powershell告诉何时将一系列文件添加到网络中

问题描述 投票:1回答:1

所以我有一个powershell脚本,主要是从这里的类似问题中提取的,它可以检测何时将某种类型的文件添加到某个网络并在发生这种情况时发送电子邮件:

Function Watcher{

param ($folder, $filter, $to, $Subject)



$watcher = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
    IncludeSubdirectories = $true
    EnableRaisingEvents = $true
}

$changeAction = [scriptblock]::Create('

        $path = $Event.SourceEventArgs.FullPath
        $name = $Event.SourceEventArgs.Name
        $changeType = $Event.SourceEventArgs.ChangeType
        $timeStamp = $Event.TimeGenerated
        Write-Host "The file $name was $changeType at $timeStamp"

        $Body = "The file $name was $changeType at $timeStamp"

        Email $to $Subject $Body

 ')

    Register-ObjectEvent $Watcher -EventName "Created" -Action $changeAction


}

但是,我想对此进行修改,以使其对本应用程序有用:现在有一个工具可以将数据(.datx文件)添加到网络(每分钟几个文件),我想收到电子邮件通知,记录数据的那一刻。我如何最轻松地修改它,以便在触发初始监视程序时,它等待以查看是否再次发生并重置(如果重置),然后继续重置(如果没有)?还是最好创建一个全新的脚本?基本上,我该如何使观察者被上载到网络的一个单独的.datx文件激活,但又不能被其中的一系列流触发(除了最后一个)触发它]

powershell
1个回答
1
投票
您可以使用以下

batching方法:

  • 定义滑动时间窗口的长度,如果在其中创建了新文件,该时间窗口将重置;当事件到达该滑动窗口时,请继续收集事件。

      为了防止集合无限期增长,请定义一个最大的批处理大小,即使要处理其他事件,也要处理该批处理。
  • 一旦时间窗口过去而没有新事件到达,请处理当前的批次,即到目前为止收集的事件,然后开始新的批次。
  • Caveat:

  • 事件。
  • 下面的代码消除重复项[[给定批次
  • ,但不消除

    跨批次,这将需要更多的精力-请参见源代码注释。

    实施说明:
    • 而不是使用传递给System.IO.FileSystemWatcher-Action脚本块来处理事件,而是在Register-ObjectEvent循环中
    • 同步
  • -超时处理。

    Register-ObjectEvent使用PowerShell的事件

  • queue
  • ,因此通常不会丢失事件(尽管在大容量情况下可能会在.NET级别发生);相比之下,Wait-Event的类似Wait-Event方法执行

    not

    队列事件,并且如果在该方法等待时碰巧到达一个事件,则仅报告一个-单事件。Wait-Event
    首先创建一批3个文件,然后再创建5个文件的示例输出:
    FileSystemWatcher
    © www.soinside.com 2019 - 2024. All rights reserved.