Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 从文本文件中删除具有过去日期的行_Powershell - Fatal编程技术网

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

Powershell 从文本文件中删除具有过去日期的行,powershell,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

我有一个名为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
今天的日期是2019年1月29日,可以删除旧班次。如果文件中只有如上所述的旧班次,则不会删除它们。当我添加一个未来的日期时,它会删除旧的日期,只保留未来的日期

$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;
$SpecialRosterPath=“C:\Helpline Dialer\HelplineSpecialRoster.txt”
$CurrentDate2=(获取日期).Date#将日期时间从今天00:00:00开始
函数DeleteOlderShifts{
$CurrentAndFutureShifts=获取内容$SpecialPosterPath | Where对象{
$\匹配“^(?\d{2})\/(?\d{2})\/(?\d{4})”-和
(获取日期-年$Matches.Year-月$Matches.mon-日$Matches.Day)-ge$CurrentDate2
}
$Current和FutureShift
$CurrentAndFutureShifts |设置内容$SpecialPosterPath
}
删除股东权益;

有什么想法吗?

不要使用文本文件,而是使用带有标题的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

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

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

$CurrentAndFutureShifts | Set-Content $SpecialRosterPath
进入


尝试导入Csv-使用文化而不是
获取内容
。然后,比较第1栏中的日期可能会变得更容易。虽然我认为所选择的方法确实有改进的余地,但原则上它应该是有效的(显然过去也是如此)。如果重新创建输入文件解决了问题,那么问题可能出在输入文件/数据上,而不是代码本身。也许是编码问题。但是,如果不访问工作和非工作样本输入文件,我们就无法对其进行分析。如果文件中有未来的变化,比如
2019年2月5日上午6点,库尔特0400012345,kurt@outlook.com
今天的日期是2019年1月29日,它可以删除旧班次。如果文件中只有如上所述的旧班次,则不会删除它们。当我添加一个在未来的日期时,它可以删除旧的日期,只保留未来的日期。谢谢,我下一步会尝试,我有更多的信息。如果文件中有未来的变化,比如
2019年2月5日上午6点,库尔特0400012345,kurt@outlook.com
今天的日期是2019年1月29日,它可以删除旧班次。如果文件中只有我上面的问题中提到的旧班次,它不会出于某种原因删除它们。当我添加一个将来的日期时,它会删除旧的日期,只保留将来的日期。
Import Csv
即使文件本身没有标题也可以使用:
Import Csv input.Csv-标题日期、时间、号码、姓名、电子邮件
。我个人会偏离你例子中的方法。这意味着调整将此文件输入下拉菜单的代码。在我看来完全值得。这是我的答案,谢谢。我花了一段时间才弄清楚到底出了什么问题。
Set-Content -Value $CurrentAndFutureShifts -Path $SpecialRosterPath