У меня есть этот сценарий
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'
function Hide-Console
{
$consolePtr = [Console.Window]::GetConsoleWindow()
#0 hide
[Console.Window]::ShowWindow($consolePtr, 0)
}
Hide-Console
$docs = [environment]::GetFolderPath("MyDocuments")
$zwift = "$docs\Zwift" # Zwift data directory
$log = "$zwift\Logs\Log.txt" # Path to Zwift log file
$output = "$zwift\Logs\GroupEvents.txt" # File to write output to
$delay = 6000 # Delay in ms between updates of the file
Function Write-SlowOutput {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true,
HelpMessage="How long to pause for (ms)")]
[int32]$waitFor,
[Parameter(Mandatory=$false,
HelpMessage="File to output to")]
[string]$outputFile,
[Parameter(ValueFromPipeline)]
[Object]$input
)
BEGIN {}
PROCESS {
Write-Host $input
if ($outputFile) {
Out-File -Encoding UTF8 -FilePath $outputFile -InputObject $input
}
Start-Sleep -Milliseconds $waitFor
}
END {}
}
Get-Content -Tail 0 -Wait -Encoding "UTF8" $log |
Select-String "GroupEvents: Linedup for group (.*), subgroup" |
% {$_.matches.groups[1].value} |
Write-SlowOutput -outputFile $output -waitFor $delay
Этот сценарий просматривает файл журнала моей игры и извлекает некоторый текст на основе строки строки выбора
Select-String "GroupEvents: Linedup for group (.*), subgroup" |
Ожидаемый результат - простая текстовая фраза или предложение, например, Group Run. Но на самом деле не важно, какой именно вывод текста.
У меня есть несколько экземпляров этого скрипта, каждый из которых выполняет поиск отдельной строки в файле журнала и выводит другую строку текста. Все к одному выходному файлу. По сути, последняя найденная строка перезаписывает предыдущую, что мне и нужно.
Итак, как мне переписать этот скрипт, чтобы мне не нужно было запускать несколько экземпляров, пожалуйста? Например ..
Select-String "GroupEvents: Linedup for group (.*), subgroup" |
Select-String "Workout(.*)" |
Select-String "GroupEvents: Started in group (.*), subgroup" |
Select-String "Run Device Selected: (.*)" |
Я бы хотел, чтобы скрипт выполнял поиск по каждой из этих строк и просто выводил последнюю из найденных в файле журнала в выходной файл.
Я только что попробовал копирование последних трех строк кода, но это не сработало. Я не программист (ясно!), Так что лучше всего гадать и чаще всего использовать метод проб и ошибок.
Любая помощь с этим очень ценится.