从文本文件中删除带有过去日期的行

时间:2019-01-28 18:45:31

标签: powershell

我有一个名为HelplineSpecialRoster.txt的文本文件,看起来像这样

01/01/2019,6AM,0400012345,Kurt,kurt@outlook.com
02/01/2019,6AM,0412345676,Bill,bill@outlook.com
03/01/2019,6AM,0400012345,Sam,Sam@outlook.com
04/01/2019,6AM,0412345676,Barry,barry@outlook.com
05/01/2019,6AM,0400012345,Kurt,kurt@outlook.com

我在澳大利亚,所以日期是日/月/年。

我有一些代码可以创建一个列表框,以显示文本文件中的行,但是我想在文本文件显示之前只对其显示较早的日期进行编辑。一个乐于助人的人给了我这段代码,它曾经工作过一次,但由于某种原因现在停止工作了。当我删除整个文本文件并重新创建它时,它再次开始工作,但只有一次。

如果文件中将来有更改,请说

05/02/2019,6AM,0400012345,Kurt,kurt@outlook.com

,今天是29/01/2019,它可以删除以前的班次。如果文件中只有上述旧班次,则不会删除它们。当我添加一个将来的日期时,它将删除较旧的日期,只保留将来的日期。

$SpecialRosterPath = "C:\Helpline Dialer\HelplineSpecialRoster.txt"
$CurrentDate2 = (Get-Date).Date  # to have a datetime starting today at 00:00:00

Function DeleteOlderShifts {
    $CurrentAndFutureShifts = Get-Content $SpecialRosterPath | Where-Object {
        $_ -match "^(?<day>\d{2})\/(?<mon>\d{2})\/(?<year>\d{4})" -and
        (Get-Date -Year $Matches.year -Month $Matches.mon -Day $Matches.day) -ge $CurrentDate2
    }
    $CurrentAndFutureShifts
    $CurrentAndFutureShifts | Set-Content $SpecialRosterPath
}

DeleteOlderShifts;

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

当输入文件中只有较早的日期时,$CurrentAndFutureShifts中的结果将为空。跳过管道中的空值,这意味着没有任何内容写入输出文件,因此输出文件保持不变。

您可以通过将变量传递给参数-Value来避免此问题。更改

$CurrentAndFutureShifts | Set-Content $SpecialRosterPath

进入

Set-Content -Value $CurrentAndFutureShifts -Path $SpecialRosterPath

答案 1 :(得分:0)

使用带标题的CSV文件而不是使用文本文件。本质上,这只是一个保存为.csv文件扩展名的文本文件,该文件扩展名包括每列的标题:

请注意,我在底部添加了一个额外的行,该行的日期早于今天以证明测试。

HelpineSpecialRoster.csv内容:

Date,Time,Number,Name,Email
01/01/2019,6AM,400012345,Kurt,kurt@outlook.com
02/01/2019,6AM,412345676,Bill,bill@outlook.com
03/01/2019,6AM,400012345,Sam,Sam@outlook.com
04/01/2019,6AM,412345676,Barry,barry@outlook.com
05/01/2019,6AM,400012345,Kurt,kurt@outlook.com
01/02/2019,6AM,400012345,Dan,dan@outlook.com

设置CSV的路径:

$csvPath = "C:\HelpineSpecialRoster.csv"

从文件导入CSV:

$csvData = Import-CSV $csvPath

在00:00获取今天的日期

$date = (Get-Date).Date

过滤csv数据以显示日期早于当前日期的行:

$csvData = $csvData | ? { (Get-Date $date) -lt (Get-Date $_.Date) }

将CSV数据导出回原始CSV:

$csvData | Export-CSV $csvPath -Force