我有两个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年左右的时间都是真的需要。
答案 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'