Powershell элегантно перечисляет несколько переменных - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть текстовый вывод, который показывает время выполнения каждого выбора, который я делаю в скрипте.

Уровень проверки: 0, 38,99407466333333

Уровень проверки: 1, 60,93540646055553

и т. Д.

Что бы я хотелdo имеет несколько строк read-host, показывающих выбор уровня, на который я хотел бы перейти, и рядом с ним переменная, показывающая, сколько времени в среднем это занимает, то есть «Checklevel 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 голосов
/ 27 сентября 2018

Whlist gvee * Решение 1002 * простое и элегантное, оно не сработает, если вы хотите показать меню, которое также показывает время выполнения.

При этом выпрямо на пути к более простому решению.Всякий раз, когда имеется более чем, скажем, три переменные с именами value0, value1, ... valuen , обычно пора использовать структуру данных.Массив будет очевидным выбором, довольно часто хеш-таблица тоже подойдет.Через .Net существует много типов для более особых нужд.

Если вам нужно выполнить более сложную обработку с файлом данных, рассмотрите возможность его предварительной обработки.Давайте использовать регулярное выражение и хеш-таблицу, например,

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...