【发布时间】:2015-10-28 20:25:27
【问题描述】:
目前有一个脚本将运行服务器上的所有用户文件并根据上次访问时间输出它们。客户想要一份关于去年未触及的文件的报告。
问题是,报告太大了。根据我的测试样本集,我估计有超过 200 万行 CSV。因此,不是一个 HUGE 文件,我想将此脚本转换为输出许多较小的报告,按用户细分。
扫描根用户目录,输出包含该用户名的 CSV,然后迭代到下一个用户,然后重复。
$cutOffDate = (Get-Date).addYears(-1)
$arr = @()
$exclusions = @(".lnk",".url",".ini",".odc",".ctx",".upd",".ica")
gci "D:\USER_FILES\company\USERS\Lname, Fname" -Recurse | ? {
$_.PSIsContainer -eq $False -and
$_.LastAccessTime -le $cutOffDate -and
$exclusions -notcontains $_.Extension -and
$_.length -gt "0" -and
$_.Directory -notmatch ".*USERS\\.*\\Personal\\sysdata\\cookies"
} | % {
$obj = New-Object PSObject
$obj | Add-Member NoteProperty Directory $_.DirectoryName
$obj | Add-Member NoteProperty Name $_.Name
$obj | Add-Member NoteProperty MB ("{0:N3}" -f ($_.Length/1MB))
$obj | Add-Member NoteProperty created $_.creationtime
$obj | Add-Member NoteProperty LastAccessed $_.LastAccessTime
$obj | Add-Member NoteProperty LastMofified $_.LastWriteTime
$obj | Add-Member NoteProperty Extension $_.Extension
$arr += $obj
}
$arr | Export-CSV -notypeinformation "C:\Output.csv"
下面是编辑 - 输出到管道而不是数组
$cutOffDate = (Get-Date).addYears(-1)
$exclusions = @(".lnk",".url",".ini",".odc",".ctx",".upd",".ica")
Get-ChildItem 'D:\USER_FILES\company\USERS' | ? { $_.PSIsContainer } | % {
$name = $_.Name
Get-ChildItem $_.FullName -Recurse |
? {
$exclusions -notcontains $_.Extension -and
$_.PSIsContainer -eq $false -and
$_.LastAccessTime -le $cutOffDate -and
$_.length -gt "0" -and
$_.Directory -notmatch '.*USERS\\.*\\Personal\\sysdata\\cookies'
} |
select DirectoryName, Name, @{n='MB';e={"{0:N3}" -f ($_.Length/1MB)}},
CreationTime, LastAccessTime, LastWriteTime, Extension |
Export-Csv "D:\User-Files-Output\$name.csv" -NoType
}
注意:忽略初始路径,我现在是在diff环境下测试,所以C盘还是D,根路径还是USERS。
【问题讨论】:
-
如果报告太大,那么总结一下。例如,您可以将 CSV 加载到 Excel 中并在其上运行数据透视表,然后按用户、访问存储桶(1 个月、2 个月、1 年等)、文件大小分析计数。我一直发现这是一个迭代过程。一旦客户看到报告,他们就会想到他们想要的其他东西。给他们一个带有一些有用分组的交叉表(是否有一个有用的用户层次结构,即按部门)可以很快满足这一点
标签: powershell csv output