Powershell优雅地枚举了几个变量

时间:2018-09-27 05:42:51

标签: powershell

我有一个文本输出,显示我在脚本中进行的每个选择的运行时间。

  

检查级别:0,38.99607466333333

     

检查级别:1、60.93540646055553

     

我想做的是有一些读取主机行,显示我想进入的级别的选择,然后在变量旁边显示平均需要多长时间,即“检查级别1”需要60分钟的时间。

以下脚本有效,但我不禁想到还有更好的选择:

$CheckLevel0 = Get-Content $RuntimeFile | Where {$_ -like "Check Level: 0,*"}
$CheckLevel1 = Get-Content $RuntimeFile | Where {$_ -like "Check Level: 1,*"}
$CheckLevel2 = Get-Content $RuntimeFile | Where {$_ -like "Check Level: 2,*"}
$CheckLevel3 = Get-Content $RuntimeFile | Where {$_ -like "Check Level: 3,*"}
$CheckLevel4 = Get-Content $RuntimeFile | Where {$_ -like "Check Level: 4,*"}
$CheckLevel5 = Get-Content $RuntimeFile | Where {$_ -like "Check Level: 5,*"}

理想情况下,我希望所有$ CheckLevelx变量都填充一到两行...我已经尝试了各种方法。

1 个答案:

答案 0 :(得分:1)

whlist gvee 的解决方案简单而优雅,如果您想显示一个同时显示执行时间的菜单,则该方法不起作用。

话虽这么说,您正走上简单解决方案的轨道。每当一个变量具有三个以上的变量,分别是 value0,value1,... valuen 时,通常是时候使用数据结构了。数组是一个显而易见的选择,通常哈希表也可以。通过.Net,many types可以满足更多特殊需求。

如果需要对数据文件进行更复杂的处理,请考虑对其进行预处理。让我们像这样使用正则表达式和哈希表,

# Some dummy data. Note the duplicate entry for level 1
$d = ('Check Level: 0, 38.99607466333333',` 
'Check Level: 1, 60.93540646055553',`
'Check Level: 2, 34.43543543967473',`
'Check Level: 1, 99.99990646055553')

# A regular expression to match strings
$rex = [regex]::new('Check Level: (\d+),.*')

# Populate a hashtable with contents
$ht = @{}
$d | % {
    $level = $rex.Match($_).groups[1].value
    $line = $rex.Match($_).groups[0].value
    if( $ht.ContainsKey($level)) {
        # Handle duplicates here.
        $ht[$level] = $line
    }
    else {
        $ht.Add($level, $line)
    }
}
# Print the hashtable in key order.
$ht.GetEnumerator() | sort

Name                           Value
----                           -----
0                              Check Level: 0, 38.99607466333333
1                              Check Level: 1, 99.99990646055553
2                              Check Level: 2, 34.43543543967473