更新导出的csv powershell的列值

破碎的乌鸦

我有以下代码可以正常工作。尽管我现在需要在一个特定的列中修改输出,所以我可以正确地按此列排序。

这是我的代码:

$inputFile  = "C:\Data\expPasswords\expPasswords.csv"
$outputFile = "C:\Data\expPasswords\expPasswordsUp.csv"

$result = Import-Csv $inputFile |
            Select-Object @{ Name = 'Account'; Expression = { $_.Account  } },
                          @{ Name = 'Days until Expiry'; Expression = { $_.'time until password expires' } },
                          @{ Name = 'Email address'; Expression = { $_.'email address'  } }

# output on screen
$result | Sort-Object -Property 'Days until Expiry' | Format-Table -AutoSize

# output to csv
$result | Sort-Object -Property 'Days until Expiry' | Export-Csv -Path $outputFile -NoTypeInformation

我需要按“到期前的天数”列进行排序。虽然在输出如下所示时比较困难:

0分钟
0分钟
1天和19小时
1天和2小时
1天和20小时
1天和23小时
13小时
2天
20小时

基本上,我想做的是:
-如果少于1天,请输入值:今天
-删除小时和分钟块。
-因此,如果是13小时,请输入值:今天
-如果值为1天和1小时35分钟,请输入值:1天

任何帮助将不胜感激。;-)

根据

您应该花一些时间来从这个相当愚蠢的输出中了解一些信息,这很可惜,但是当然可以做到。基本上,您要做的就是找出字符串是否以数字开头,后跟单词“ day”或“ days”,然后截断所有其余部分。如果不是这种情况,则返回的值应为“ Today”。

我认为最简单的方法是使用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

正则表达式详细信息:

^在字符串的开头
\ d声明位置\ d匹配作为“数字”的单个字符(任何Unicode脚本中的任何十进制数字)
   +一次至无限次之间,尽可能多次,并根据需要返回(贪婪)
\ day从字面上匹配字符串“ day”(区分大小写)
s从字面上匹配字符“ s”(区分大小写)在零到一遍之间,尽可能多地遍历,并根据需要进行回馈(贪婪)

看到您的评论,我建议添加一个实际的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

输出:

帐户电子邮件地址到期日之前的天数  
------- ------------- ----------------- ----- ----------   
User1 [email protected]今天6-4-2020 0:00:00 
User6 [email protected]今天6-4-2020 0:03:00 
User8 [email protected]今天6-4-2020 13:00:00 
User4 [email protected]今天6-4-2020 20:00:00 
User9 [email protected] 1 7-4-2020 2:00:00 
User2 user2 @ yourcompany。 com 1 7-4-2020 19:00:00 
User5 [email protected] 1 7-4-2020 20:00:00  
User7 [email protected] 1 7-4-2020 23:00:00
User3 [email protected] 2 8-4-2020 0:00:00

如果您不想在输出中使用新属性“到期日期”,只需使用以下方法将其过滤掉:

$result | Select-Object * -ExcludeProperty 'Expiration Date'

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Powershell CSV命令使用特定列导出

来自分类Dev

使用Powershell导出Csv

来自分类Dev

powershell csv捕获三列的1值

来自分类Dev

使用 Powershell 更新 CSV 列

来自分类Dev

通过Powershell导出csv遍历并检索xml值

来自分类Dev

如何使用 powershell 导出 CSV 文件中的 GetFolderContent $ rootFolder 值

来自分类Dev

Powershell-将数组导出到不同列中的CSV

来自分类Dev

如何将powershell代码导出到csv正确列

来自分类Dev

添加列以动态导出CSV

来自分类Dev

导出在列中找到重复值的csv行

来自分类Dev

根据Powershell中的列值删除CSV行

来自分类Dev

根据Powershell中的列值删除CSV行

来自分类Dev

CSV中的Powershell组对象并导出

来自分类Dev

Powershell JSON到CSV的转换和导出

来自分类Dev

Powershell导出CSV,但更改标题名称

来自分类Dev

导入Excel,使用PowerShell导出CSV

来自分类Dev

如何使用 Powershell 正确导出到 CSV

来自分类Dev

无法在Powershell中导出CSV文件,空CSV文件

来自分类Dev

Powershell循环csv文件一次导出csv行

来自分类Dev

如何使用正确的标识列导出 CSV

来自分类Dev

如何更新 CSV 值

来自分类Dev

匹配 CSV 中的列并导出具有唯一值的 CSV

来自分类Dev

如何使用超过65536行(和48列)的Powershell将CSV导出到Excel

来自分类Dev

Powershell:登录时更新CSV

来自分类Dev

使用R导出后更新CSV文件

来自分类Dev

您可以根据列值将Postgres表导出到多个CSV文件中吗?

来自分类Dev

数据表,将数据表导出到列值带有逗号的CSV文件

来自分类Dev

使用具有动态值的Powershell在CSV中创建新列

来自分类Dev

Windows Powershell Export-CSV列/行值作为文件名