在许多1000 powershell中导出/附加csv

时间:2017-06-13 02:05:11

标签: powershell crash export

我试图在设定的日期之后从设定位置提取所有.txt和.pdf文件,然后将它们导出到csv。它起到了一定的作用,但当我输入太多数据时,它会崩溃(比如对服务器进行排序)。我假设内存已满。它也必须像现在一样递归。如果我只是在-Append之后添加Export-Csv,它会告诉我“附加的对象没有与以下列对应的属性:”并添加-Force但是如果我添加{{} 1}} -Force之后它告诉我“无法处理参数,因为参数”name“的值无效”。我一直在看-Append Cmdlet,但无济于事。如果你有它,那就寻找一点智慧:)

ForEach

2 个答案:

答案 0 :(得分:2)

假设您只需要一列,请节省内存并使脚本更快:

$files = [Collections.Generic.SortedSet[string]]@()
foreach ($file in ([IO.DirectoryInfo]$RelPath).EnumerateFiles('*', 'AllDirectories') {
    if (($file.Extension -eq '.pdf' -or $file.Extension -eq '.txt') -and
        $file.LastWriteTime -gt $startdate -and $file.LastWriteTime -lt $today)
    {
        $files.Add('"' + $file.$RelFiles + '"') >$null
    }
}
$UTF8noBOM = [Text.UTF8Encoding]$false
[IO.File]::WriteAllLines('r:\out.csv', '"' + $RelFiles + '"', $UTF8noBOM)
[IO.File]::AppendAllLines('r:\out.csv', $files, $UTF8noBOM)

在具有96K文件的高度嵌套文件夹上的PowerShell 5中测试,该文件生成一个包含2500行的CSV:
原始代码为2秒vs 15秒,
使用3 MB与20 MB内存。

答案 1 :(得分:0)

伟大的社区,这是解决问题的最终代码

Param(
$startdate = (read-host -Prompt "Enter date"),
$startdate2 =[datetime]::ParseExact("$startdate", "dd/MM/yy", $null),
$today     = (Get-Date),      
$RelPath = (read-host -Prompt "Enter filepath"),
$RelFiles = "FullName"
)
 Get-ChildItem -Path $RelPath"*.pdf", "*.txt" -Recurse|
Where-Object  { $_.LastWriteTime -gt $startdate2 -and $_.LastWriteTime -lt $today}|
select -Property  $RelFiles |export-csv C:\PowershellNewWork\New.csv