2017-06-13 67 views
0

我试图从一组位置提取所有.txt和.pdf文件,一组日期后,并将其导出为CSV。它工作到一定程度,但是当我给它提供太多的数据时会崩溃(比如排序服务器)。我假设内存已满。它也必须像现在一样递增。如果我简单地在Export-Csv后面添加-Append它告诉我“附加对象没有对应于以下列的属性:”并添加-Force,但如果我在-Append后面添加-Force它告诉我“无法处理参数,因为值参数“名称”无效“。我一直在寻找ForEach Cmdlet,但无济于事。寻找一点点智慧,如果你知道了:)导出/ CSV追加在许多1000的PowerShell

Param(
$startdate = (read-host -Prompt "Enter date"), 
$today  = (Get-Date),  
$RelPath = (read-host -Prompt "Enter filepath"), 
$RelFiles = "FullName" 
) 
Get-ChildItem -Path $RelPath"*.pdf", "*.txt" -Recurse| 
Where-Object { $_.LastWriteTime -gt $startdate -and $_.LastWriteTime -lt 
$today}|select -Property $RelFiles |sort -Property $RelFiles |export-csv 
C:\PowershellNewWork\New.csv 
+5

*当我给它崩溃*数据太多 - 有什么错误讯息?是的''sort'会将所有内容存储在内存中,但是Windows使用磁盘空间作为虚拟内存,所以除非你有a)手动限制,否则b)磁盘空间不足,这应该只会减慢速度而不是崩溃。也有'$ -Path RelPath“* PDF”你的命令,“*。txt'大概不是做你想要什么。它看起来像它会搜索你所选择的道路为PDF文件,以及TXT文件的当前路径。尝试'获取-ChildItem -Path $ RelPath -Include的* .pdf,*。TXT -Recurse' – TessellatingHeckler

+0

干杯的帮助:)我会发布了一个错误味精,但只有当我的老板跑了它在服务器上坠毁。对于任何人在未来这一块保存,因为它去 –

+0

干杯的帮助:)我会发布了一个错误味精,但只有当我的老板跑了它在服务器上坠毁。为了在以后任何人这个保存为它去帕拉姆( $ startdate =(read-host -Prompt“Enter date date”), $ today =(Get-Date -DisplayHint Date), $ RelPath =(read-host -Prompt“Enter filepath”), $ RelFiles =“ FullName“ ) Get-ChildItem -Path $ RelPath -Include“* .pdf”,“* .txt”-Recurse | 位置对象{$ _ LastWriteTime -gt $ STARTDATE -and $ _ LastWriteTime -lt $今天。} | select -Property FullName | export-csv D:\ workexp \ New。csv –

回答

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) 

在PowerShell中5测试在一个高度嵌套的文件夹96K的文件产生2500行的CSV:
2秒对15秒钟的原始代码,
3 MB对20 MB存储器使用。

+0

现在还没有PSv5测试,但至少在旧版本中'[void ] $ files.Add('''+ $ file。$ RelFiles +''')'会更快(非常小); – whatever

+0

@whatever,'[void]'与' > $ null'在我的答案中提到的设置中测量。不要成为“hax0r”。 – wOxxOm

+0

'[void]'只有在非实用的合成测试中才会显着加快,例如'foreach($ i in 1..1e6){[void] $ i}'这里没有有用的代码。在真实世界的代码中,运行有用函数所需的时间超过类型转换或空重定向时间*数量级*。 – wOxxOm

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