我试图在设定的日期之后从设定位置提取所有.txt和.pdf文件,然后将它们导出到csv。它起到了一定的作用,但当我输入太多数据时,它会崩溃(比如对服务器进行排序)。我假设内存已满。它也必须像现在一样递归。如果我只是在-Append
之后添加Export-Csv
,它会告诉我“附加的对象没有与以下列对应的属性:”并添加-Force
但是如果我添加{{} 1}} -Force
之后它告诉我“无法处理参数,因为参数”name“的值无效”。我一直在看-Append
Cmdlet,但无济于事。如果你有它,那就寻找一点智慧:)
ForEach
答案 0 :(得分:2)
假设您只需要一列,请节省内存并使脚本更快:
Get-ChildItem
Sort
快,并且不会复制内容foreach
语句和普通if
检查
$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