PowerShell导出.js文件搜索结果至CSV的问题排查与解决
多设备查找.js文件并导出CSV的问题与解决方案
我需要在多台设备上查找指定时间范围内的.js文件,并将文件名、文件路径、所在设备导出到CSV,但过程中遇到了不少问题,以下是我的尝试过程及最终优化方案:
初始代码(CSV导出为空)
这段代码运行后生成的CSV文件为空,实际应有大量结果:
$servers = Get-Content -Path C:\servers.txt $report = @() foreach ($server in $servers) { $info = Invoke-Command -computername $server -ScriptBlock { Get-ChildItem "*.js" -Recurse | Where-Object { $_.CreationTime -ge "05/07/2023" -and $_.CreationTime -le "11/07/2023"} | Select ServerName, Name } } $report | Export-Csv -Path "c:\results.csv" -NoTypeInformation
问题分析
- 未将
Invoke-Command返回的文件结果添加到$report数组中,导致最终导出时数组为空 - 远程脚本块中
Select ServerName无效,Get-ChildItem的输出对象没有ServerName属性
第一次更新(CSV仅含计算机名,无文件信息)
修改后CSV仅显示计算机名,无法看到具体文件结果:
$servers = Get-Content -Path C:\servers.txt $report = @() foreach ($server in $servers) { $files = Invoke-Command -computername $server -ScriptBlock { Get-ChildItem "*.js" -Recurse | Where-Object { $_.CreationTime -ge "05/07/2023" -and $_.CreationTime -le "11/07/2023"} | Select-Object -ExpandProperty VersionInfo } $info = "" | Select ServerName, Name $info.ServerName = $server $info.Name = $files $report+=$info } $report $report | Export-Csv -Path "c:\results.csv" -NoTypeInformation
问题分析
将文件对象集合直接赋值给Name属性,导出CSV时会被序列化为对象类型字符串,无法正确显示文件名等信息,且丢失了文件路径等关键数据。
第二次更新(可用但需优化)
这段代码能导出基础文件信息,但缺少所在设备字段,且信息不够完整:
$servers = Get-Content -Path C:\servers.txt $report = @() foreach ($server in $servers) { $files = Invoke-Command -computername $server -ScriptBlock { Get-ChildItem -Path "C:\" -Filter "*.js" -Recurse | Where-Object { $_.CreationTime -ge "05/07/2023" -and $_.CreationTime -le "11/07/2023"} | Select-Object -ExpandProperty VersionInfo } $report+=$files } $report $report | Export-Csv -Path "c:\results.csv" -NoTypeInformation
最终优化代码
以下代码解决了所有问题,能正确导出设备名、文件名、完整路径到CSV:
$servers = Get-Content -Path C:\servers.txt $report = foreach ($server in $servers) { Invoke-Command -ComputerName $server -ScriptBlock { Get-ChildItem -Path "C:\" -Filter "*.js" -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.CreationTime -ge [datetime]"2023-07-05" -and $_.CreationTime -le [datetime]"2023-07-11" } | Select-Object @{Name='ServerName'; Expression={$using:server}}, Name, FullName } } $report | Export-Csv -Path "c:\results.csv" -NoTypeInformation
优化说明
- 直接通过
foreach循环输出结果到$report,避免低效的数组拼接操作 - 使用
$using:server在远程脚本块中引用本地的服务器名变量,添加ServerName字段 - 选择
Name(文件名)和FullName(完整路径),保留关键文件信息,无需依赖VersionInfo - 用强类型
[datetime]解析日期,避免因系统区域格式不同导致的日期判断错误 - 添加
-ErrorAction SilentlyContinue跳过无权限访问的目录,避免脚本中断
内容的提问来源于stack exchange,提问作者Wychrit
相关产品推荐
相关产品推荐

