Жаль, что вам стоит потратить время на то, чтобы разобраться в этом довольно глупом выводе sh, но, конечно, это можно сделать. По сути, все, что вам нужно сделать, это выяснить, начинается ли строка с числа, за которым следует слово «день» или «дни», и обрезать все остальные. Если это не так, возвращаемое значение должно быть «Сегодня».
Я думаю, что самый простой способ сделать это - использовать switch -Regex
.
Попробуйте
$inputFile = "C:\Data\expPasswords\expPasswords.csv"
$outputFile = "C:\Data\expPasswords\expPasswordsUp.csv"
$result = Import-Csv $inputFile | ForEach-Object {
$daysLeft = switch -Regex ($_.'time until password expires') {
'^(\d+ days?)' { $matches[1] }
default { 'Today' }
}
[PsCustomObject]@{
'Account' = $_.Account
'Days until Expiry' = $daysLeft
'Email address' = $_.'email address'
}
} | Sort-Object -Property 'Days until Expiry'
# output on screen
$result | Format-Table -AutoSize
# output to csv
$result | Export-Csv -Path $outputFile -NoTypeInformation
Подробности регулярного выражения:
^ Assert position at the beginning of the string
\d Match a single character that is a “digit” (any decimal number in any Unicode script)
+ Between one and unlimited times, as many times as possible, giving back as needed (greedy)
\ day Match the character string “ day” literally (case sensitive)
s Match the character “s” literally (case sensitive)
? Between zero and one times, as many times as possible, giving back as needed (greedy)
Просматривая ваш комментарий, я бы предложил добавить для сортировки настоящий объект DateTime.
Примерно так:
$today = (Get-Date).Date
$result = Import-Csv 'D:\test.csv' | ForEach-Object {
$expiryString = $_.'time until password expires'
$expiryDate = $today
if ($expiryString -match '(\d+)\s*day') { $expiryDate = $expiryDate.AddDays([int]$matches[1]) }
if ($expiryString -match '(\d+)\s*hour') { $expiryDate = $expiryDate.AddHours([int]$matches[1]) }
if ($expiryString -match '(\d+)\s*minute') { $expiryDate = $expiryDate.AddMinutes([int]$matches[1]) }
if ($expiryString -match '(\d+)\s*second') { $expiryDate = $expiryDate.AddSeconds([int]$matches[1]) }
$daysLeft = if ($expiryDate.Date -eq $today) { 'Today' } else { ($expiryDate - $today).Days}
[PsCustomObject]@{
'Account' = $_.Account
'Email address' = $_.'email address'
'Days until Expiry' = $daysLeft
'Expiration Date' = $expiryDate
}
} | Sort-Object -Property 'Expiration Date'
# output on screen
$result
Вывод:
Account Email address Days until Expiry Expiration Date
------- ------------- ----------------- ---------------
User1 user1@yourcompany.com Today 6-4-2020 0:00:00
User6 user6@yourcompany.com Today 6-4-2020 0:03:00
User8 user8@yourcompany.com Today 6-4-2020 13:00:00
User4 user4@yourcompany.com Today 6-4-2020 20:00:00
User9 user9@yourcompany.com 1 7-4-2020 2:00:00
User2 user2@yourcompany.com 1 7-4-2020 19:00:00
User5 user5@yourcompany.com 1 7-4-2020 20:00:00
User7 user7@yourcompany.com 1 7-4-2020 23:00:00
User3 user3@yourcompany.com 2 8-4-2020 0:00:00
Если вы не хотите, чтобы это новое свойство 'Дата истечения' в вашем выводе, просто отфильтруйте его с помощью:
$result | Select-Object * -ExcludeProperty 'Expiration Date'