如何使用PowerShell按日期筛选合并CSV文件并导出至指定文件夹
你的需求完全可以实现,不过当前用Group-Object生成布尔键哈希表的思路有点绕——分组操作会把不符合条件的文件也一并加载到内存里,属于多余步骤,直接加过滤条件捞取目标文件再处理即可,逻辑更简单、执行效率也更高。
实现注意事项
针对你刚接触PowerShell的情况,先明确几个容易踩坑的点:
- 如果要扫描多个文件夹,直接把所有源文件夹路径以数组形式传给
Get-ChildItem即可,需要递归扫子文件夹就加-Recurse参数 - 一定要加
-Filter *.csv和-File参数,避免把文件夹、其他格式的文件纳入处理范围 - 合并CSV不要直接拼接文本内容,用原生
Import-Csv读取结构化数据再统一导出,能避免多文件表头重复、列顺序错乱的问题 - 你当前代码用的
CreationTime是文件的创建时间,如果实际业务要按文件最后修改时间筛选,换成LastWriteTime属性更符合常规使用场景
参考代码
你可以直接用下面的脚本,把开头配置区的路径、时间阈值改成自己的实际值即可:
# ========== 配置区 按需修改 ========== $sourcePathList = @("C:\Folder1", "C:\Folder2", "C:\Folder3") # 所有需要扫描的源文件夹路径 $targetSavePath = "D:\MergedResult" # 合并后文件的存放目标文件夹 $lastDays = 7 # 筛选最近N天内的文件,测试时可以改成2 $exportFileName = "Merged_Result_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv" # 导出文件名带时间戳,避免覆盖旧文件 # ==================================== # 目标文件夹不存在时自动创建 if (-not (Test-Path $targetSavePath)) { New-Item -Path $targetSavePath -ItemType Directory -Force | Out-Null } # 筛选文件、合并内容、导出结果 Get-ChildItem -Path $sourcePathList -Filter *.csv -File | Where-Object { $_.CreationTime -ge (Get-Date).AddDays(-$lastDays) } | ForEach-Object { Import-Csv -Path $_.FullName } | Export-Csv -Path (Join-Path $targetSavePath $exportFileName) -NoTypeInformation -Encoding UTF8
额外场景说明
如果你的需求不是合并CSV内容,只是把符合日期条件的CSV文件原封不动复制到目标文件夹,不需要做内容导入导出,把上面最后一段处理逻辑替换成下面的代码即可:
Get-ChildItem -Path $sourcePathList -Filter *.csv -File | Where-Object { $_.CreationTime -ge (Get-Date).AddDays(-$lastDays) } | Copy-Item -Destination $targetSavePath -Force
内容的提问来源于stack exchange,提问作者Luke Shurtleff
相关产品推荐
相关产品推荐

