将csv行导入powershell,日期指定为大于

时间:2017-11-14 16:27:09

标签: powershell csv date import conditional-statements

我有两个csv文件。一个包含AD的报告,包含上个月创建的帐户,第二个是手动保存的数据库,理论上应该包含相同的信息,但是来自我们公司的所有历史记录,还需要一些额外的会计数据。我将AD报告导入PowerShell,现在我需要导入数据库的特定行。我需要的行由“添加日期”列中的值定义。我只需要导入日期超过特定值的行。我有这段代码:

$Report = Read-Host "File name" #AD report, last ten chars are date of report creation, in format yyyy-MM-dd 
$Date_text = $Report.Substring($Report.get_Length()-10)
$Date = Get-Date -Date $Date_text
$Date_limit = (($Date).AddDays(-$Date.Day)).Date
$Date_start = $Date_limit.AddMonths(-1)
$CSVlicence = Import-Csv $Database -Encoding UTF8 | 
where {(Where-Object {![string]::IsNullOrWhiteSpace($_.'Date added')} |
ForEach-Object{$_.'Date added' = $_.'datum Pridani' -as [datetime] $_}) -gt $Date_start}

如果这样运行,则不会导入任何内容。如果没有条件,数据库将成功导入,但它非常大,脚本的其余部分将永远存在。所以我只需要处理相关数据。我不在乎,当Date_limit是9月30日时,Date_start将是8月30日而不是8月31日。这只是几行,但是如果一切都是导入的话,所有10年左右的时间都是真的需要。

1 个答案:

答案 0 :(得分:0)

因此,根据您当前的逻辑,它会根据您的约束过滤PSCustomObject,这是处理它的错误方法,因为对象中的任何项都会导致它被过滤掉。您想过滤来源。

$Report = Read-Host -Prompt 'Filename'
## Grabs the datestamp at the end
$Date = Get-Date -Date $Report.Substring($Report.Length - 10)
## Grabs last day of previous month
$Limit = $Date.AddDays(-$Date.Day)
## Grabs last day of two months ago, inaccuracy of one day
$Start = $Limit.AddMonths(-1)

Get-Content -Path $Database -TotalCount 1 | Set-Content -Path 'tempfile'
Get-Content -Path $Database -Encoding 'UTF8' |
    ## Checks that the entry has a valid date entry within limits
    ForEach-Object {
      ## For m/d/yy or d/m/yy variants, try
      ## '\d{1,2}\/\d{1,2}\/\d{2,4}'
      If ($_ -match '\d{4}-\d{2}-\d{2}')
      {
        [DateTime]$Date = $Matches[0]
        If ($Date -gt $Start -and $Date -lt $Limit) { $_ }
      }
    } |
    Add-Content -Path 'tempfile'

$CSV = Import-Csv -Path 'tempfile' -Encoding 'UTF8'