Как преобразовать вывод из команды/приложения, чтобы в файле с помощью Powershell сохранялись только последние 1000 строк, а все остальное отображалось в терминале
Вы можете написать свою собственную Tee-Last
функцию — используйте Queue для буферизации входных элементов, а затем в конце запишите результаты в файл:
function Tee-Last {
param(
[Parameter(ValueFromPipeline = $true)]
[psobject]$InputObject,
[ValidateRange(1, 2147483647)]
[int]$Count = $(0),
[Parameter(Mandatory = $true)]
[string]$LiteralPath,
[switch]$Append
)
begin {
$isBounded = $Count -gt 0
if ($isBounded) {
$queue = [System.Collections.Queue]::new($Count)
}
else {
$queue = [System.Collections.Queue]::new()
}
}
process {
if ($isBounded -and $queue.Count -eq $Count) {
# if the queue is full, evict the oldest item
$null = $queue.Dequeue()
}
$queue.Enqueue($InputObject)
# output as-is
Write-Output $InputObject -NoEnumerate
}
end {
if ($queue.Count) {
# write the buffered items to file
$contentArgs = @{ LiteralPath = $LiteralPath }
if ($Append) {
$queue |Add-Content @contentArgs
}
else {
$queue |Set-Content @contentArgs
}
}
}
}
Затем используйте его следующим образом:
1..1000 |Tee-Last -LiteralPath .\output.txt -Count 10
Вы увидите, что хотя на экране выводятся все целые числа от 1 до 1000, файл содержит только числа от 991 до 1000.
$results = 'C:\path\to\App.exe'
$results | select -Last 10 | Out-File 'C:\path\to\LogFile.log'
Write-Output $results
Я думаю, что проблема с этим кодом заключается в том, что выходные данные сначала записываются на терминал после завершения работы приложения, и $results должен хранить весь вывод, который может быть огромным.
Благодарим вас за вклад в сообщество Stack Overflow. Возможно, это правильный ответ, но было бы очень полезно предоставить дополнительные пояснения к вашему коду, чтобы разработчики могли понять ваши рассуждения. Это особенно полезно для новых разработчиков, которые не так хорошо знакомы с синтаксисом или пытаются понять концепции. Не могли бы вы отредактировать свой ответ, включив в него дополнительную информацию на благо сообщества?