PowerShell Nested L oop внутренний L oop не работает? - PullRequest
1 голос
/ 02 апреля 2020

Привет, первый вопрос по PowerShell,

Мне нужно написать скрипт, который принимает файл журнала и выполняет в нем некоторые вычисления.

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

$inVar = Select-String -path C:\Dev\Script\Ldorado.log  -pattern "IN:"             
$outVar = Select-String -path C:\Dev\Script\Ldorado.log -pattern "OUT:"

Я получаю обратно каждую строку, где есть IN в одном массиве и OUT в другом.

I удалось разделить строки, чтобы получить только даты в каждой строке - используя .Lines.Split("(")

Если у меня есть два значения даты из массива, я могу назвать c временной интервал с New-TimeSpan и некоторые преобразования ,

Теперь мне нужно как-то сделать это для каждой записи в файле, которая соответствует шаблону, поэтому я думаю, что мне нужен L oop или даже вложенный L oop. Я пробовал каждый L oop (для / foreach / foreachObject / while ...), но безуспешно.

Например, если вы посмотрите на этот код:

foreach ($out in $outVar) {
$testVar = $out.Line.Split("(")[0]
    foreach ($in in $inVar) {
        $testIn = $in.Line.Split("(")[0]
    }
    Write-Host $testVar + $testIn
}

мой вывод выглядит так:

12:55:49  + 13:20:31 
12:55:49  + 13:20:31 
12:55:49  + 13:20:31 
13:54:35  + 13:20:31 
13:54:35  + 13:20:31 
13:54:35  + 13:20:31 
16:37:44  + 13:20:31 
16:37:44  + 13:20:31 
16:37:44  + 13:20:31 
17:15:23  + 13:20:31 
17:15:23  + 13:20:31 
17:15:23  + 13:20:31 
 9:06:13  + 13:20:31 
 9:06:13  + 13:20:31 
 ...

Правильно иметь каждое значение 3 раза, потому что для каждого журнала всегда есть IN и 3OUT.

Внешний l oop, кажется, работает правильно, но вложенный L oop просто берет последнее имеющееся значение и печатает его - вместо этого я хочу иметь то же поведение, что и внешнее l oop, где оно фактически зацикливается.

Кто-нибудь знает, как я могу это решить?

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Вы можете добавить результаты в массивы, а затем вывести их в нужном формате. Как следующий

#Empty arrays
$testIn_arr = @()
$testVar_arr = @()
foreach ($out in $outVar) {
$testVar = $out.Line.Split("(")[0]
$testVar_arr += @($testVar)
}

foreach ($in in $inVar) {
$testIn = $in.Line.Split("(")[0]
$testIn_arr += @($testIn)
}

for ($i = 0; $i -lt $testIn_arr.Count; $i++)
{
 Write-Host $($testVar_arr[$i]) + "+" + $($testIn_arr[$i])
}
0 голосов
/ 02 апреля 2020

Используйте for l oop, чтобы вы могли получить значения с одинаковым индексом из каждого массива (предполагается, что $outVar и $inVar выровнены и имеют одинаковую длину):

for($i = 0; $i -lt $outVar.Length; $i++) {
    $testVar = $outVar[$i].Line.Split("(")[0]
    $testIn  = $inVar[$i].Line.Split("(")[0]
    Write-Host $testVar + $testIn
}
...