PowerShell嵌套循环内部循环不起作用?

时间:2020-04-02 11:04:08

标签: powershell shell loops nested-loops

您在PowerShell上的第一个问题

我需要编写一个包含日志文件并在其中进行一些计算的脚本。

我正在正确读取日志文件,然后创建两个仅包含该文件中所需行的数组。

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

我返回在1个数组中有一个IN并在另一个数组中有OUT的每一行。

我设法通过使用.Lines.Split("(")

将行拆分为仅获取每行中的日期

如果我有数组中的两个日期值,则可以使用New-TimeSpan和一些转换来计算时间跨度。

现在,我需要对与模式匹配的文件中的每个条目进行某种方式的操作,所以我认为我需要一个Loop甚至是一个嵌套Loop。我尝试了每个循环(for / 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。

外部循环似乎可以正常工作,但是嵌套循环只获取存在的最后一个值并打印出来-相反,我希望具有与实际循环的外部循环相同的行为。

有人知道我该如何解决?

2 个答案:

答案 0 :(得分:0)

使用for循环,以便您可以从每个数组中的相同索引处获取值(假设$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
}

答案 1 :(得分:0)

您可以将结果添加到数组中,然后以所需的格式输出。像下面的

#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])
}
相关问题