无法在 PowerShell 中使用 FileSystemWatcher 获取已修改文件的内容

Unable to get the contents of modified file using FileSystemWatcher in PowerShell

我有一个活动的生产日志文件,它会在文件达到 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.

似乎不支持该变量

Write-Host 输出直接进入主机控制台,因此输出不会进入管道。把Write-Host去掉,括号也去掉(至于你想干什么不用先把文件读入内存)。您的 Out-File 语句的参数顺序也不正确。路径参数属于 -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 解析器。但是,那将是一个不同的问题,应该这样问。