您在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。
外部循环似乎可以正常工作,但是嵌套循环只获取存在的最后一个值并打印出来-相反,我希望具有与实际循环的外部循环相同的行为。
有人知道我该如何解决?
答案 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])
}