PowerShell 嵌套循环内部循环不起作用?
PowerShell Nested Loop inner Loop doesnt work?
你好关于 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
和一些转换来计算时间跨度。
现在我需要以某种方式为文件中与模式匹配的每个条目执行此操作,因此我认为我需要一个循环甚至嵌套循环。我尝试了每个循环(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。
外循环似乎工作正常,但嵌套循环只获取最后一个值并打印它——相反,我希望具有与实际循环的外循环相同的行为。
有人知道我该如何解决这个问题吗?
使用 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
}
您可以将结果添加到数组中,然后以所需格式输出。喜欢下面
#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])
}
你好关于 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
和一些转换来计算时间跨度。
现在我需要以某种方式为文件中与模式匹配的每个条目执行此操作,因此我认为我需要一个循环甚至嵌套循环。我尝试了每个循环(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。
外循环似乎工作正常,但嵌套循环只获取最后一个值并打印它——相反,我希望具有与实际循环的外循环相同的行为。
有人知道我该如何解决这个问题吗?
使用 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
}
您可以将结果添加到数组中,然后以所需格式输出。喜欢下面
#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])
}