无法在 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 解析器。但是,那将是一个不同的问题,应该这样问。
我有一个活动的生产日志文件,它会在文件达到 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 解析器。但是,那将是一个不同的问题,应该这样问。