【问题标题】:Unable to get the contents of modified file using FileSystemWatcher in PowerShell无法在 PowerShell 中使用 FileSystemWatcher 获取修改文件的内容
【发布时间】:2019-09-14 10:05:19
【问题描述】:

我有一个活动的生产日志文件,它会在文件达到 1 GB 的大小限制后删除日志内容,并在每个午夜压缩文件,因此在每天的压缩文件中,我们没有完整的日志流量一整天。我们拥有的只是从上次达到 1 GB 到当天午夜的日志。

我正在尝试查看该文件并将该文件的内容实时复制到其他文件。经过一番研究,我了解到FileSystemWatcher 并尝试了几种变体,但无法将文件的内容附加到另一个文件。

使用以下脚本,我可以在控制台上显示消息。但是,我无法将内容附加到另一个文件。

所以,我想要实现的是,每当 XML 文件发生更改时,日志文件和其他文件(我将使用此脚本创建)之间都会发生实时同步,以便在结束时一天,我有一个完整的日志文件。由于这是一个生产系统(即将退役),它很忙,所以我正在尝试实现一个实时同步解决方案

$folder = "C:\Users\hslasw\docs\Log_Truncation_Issue"
$filter = "*.xml"
$Watcher = New-Object IO.FileSystemWatcher $folder, $filter -Property @{ 
    IncludeSubdirectories = $false
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
$onChanged = Register-ObjectEvent $Watcher -EventName Changed -SourceIdentifier FileChanged -Action {
    $path = $Event.SourceEventArgs.FullPath
    $name = $Event.SourceEventArgs.Name
    $changeType = $Event.SourceEventArgs.ChangeType
    $timeStamp = $Event.TimeGenerated
    $filename = $path

    Write-Host (Get-Content -Path $path) |
        Out-File -Encoding Ascii -FilePath -Append C:\Users\xxxx\docs\Log_Truncation_Issue_Destination\testfile.xml
}
# Unregister-Event FileChanged

这就是问题所在:

Write-Host (Get-Content -Path $path) |
    Out-File -Encoding Ascii -FilePath -Append C:\Users\xxxx\docs\Log_Truncation_Issue_Destination\testfile.xml

有没有更好的方法?在我的情况下,拆分日志文件使其永远不会达到 1 GB 是不可能的。另外需要注意的是,APP不能被修改来改变日志行为。我也考虑过rsync,因为它是一个内置工具。但是,我需要将文件名作为变量传递,rsync 似乎不支持该变量。

【问题讨论】:

    标签: windows powershell logging filesystemwatcher


    【解决方案1】:

    Write-Host 输出直接进入主机控制台,因此输出不会进入管道。删除Write-Host,同时删除括号(至于你想要做什么,你不需要先将文件读入内存)。 Out-File 语句的参数顺序也不正确。 path 参数属于-FilePath 参数。

    $onChanged = Register-ObjectEvent $Watcher -EventName Changed -SourceIdentifier FileChanged -Action {
       $path       = $Event.SourceEventArgs.FullPath
       $name       = $Event.SourceEventArgs.Name
       $changeType = $Event.SourceEventArgs.ChangeType
       $timeStamp  = $Event.TimeGenerated
    
       Get-Content -Path $path |
           Out-File -FilePath 'C:\path\to\output.xml' -Encoding Ascii -Append
    }
    

    另外,请注意不能简单地附加到 XML 文件,因为这会产生无效的 XML。如果您需要将数据从一个 XML 文件添加到另一个 XML 文件,您应该使用 PowerShell 的 XML 解析器。但是,这将是一个不同的问题,应该这样问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 2019-07-30
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      相关资源
      最近更新 更多