我有一个文本输出,显示我在脚本中进行的每个选择的运行时间。
检查级别: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变量都填充一到两行...我已经尝试了各种方法。
答案 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