Как объединить множество скриптов Powershell в один - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть этот сценарий

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: (.*)" |

Я бы хотел, чтобы скрипт выполнял поиск по каждой из этих строк и просто выводил последнюю из найденных в файле журнала в выходной файл.

Я только что попробовал копирование последних трех строк кода, но это не сработало. Я не программист (ясно!), Так что лучше всего гадать и чаще всего использовать метод проб и ошибок.

Любая помощь с этим очень ценится.

1 Ответ

1 голос
/ 28 апреля 2020

Обновленный ответ: Я решаю проблему, которую вы сейчас задаете, а именно: «Как мне вызвать Select-String с разными шаблонами на одном входе?»

Каждый раз, когда обнаруживаются новые записи журнала , он передаст все новые записи в For-Each l oop. Затем мы можем передать текущий объект ($_) как объект конвейера в функцию ProcessLog. ProcessLog проверит ввод с Select-String для каждого шаблона и передаст элемент вашей функции Write-SlowOutput.

$log = "test.log"
$output = "output.log"

$patterns = @("GroupEvents: Linedup for group (.*), subgroup", 
              "Workout(.*)", 
              "GroupEvents: Started in group (.*), subgroup", 
              "Run Device Selected: (.*)")

function ProcessLog {
    [CmdletBinding()] Param([Parameter(ValueFromPipeline)]$item)

    Write-Output "Running with $item"

    foreach($pattern in $patterns)
    {
        $save = (Select-String -InputObject $item -Pattern $pattern | % { $_.Matches.Groups[1].Value })

        if(-not [string]::IsNullOrWhitespace($save))
        {
            $save.Trim('(').Trim(')') | Set-Content $output
            return
        }
    }
}

Get-Content -Tail 0 -Wait -Encoding "UTF8" $log | % { $_ | ProcessLog }

Я успешно проверил это, используя Set-Content для записи в выходной файл, поэтому Я просто должен предположить, что он будет работать правильно с вашей Write-SlowOutput функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...