You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题分析

  1. 未将Invoke-Command返回的文件结果添加到$report数组中,导致最终导出时数组为空
  2. 远程脚本块中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

优化说明

  1. 直接通过foreach循环输出结果到$report,避免低效的数组拼接操作
  2. 使用$using:server在远程脚本块中引用本地的服务器名变量,添加ServerName字段
  3. 选择Name(文件名)和FullName(完整路径),保留关键文件信息,无需依赖VersionInfo
  4. 用强类型[datetime]解析日期,避免因系统区域格式不同导致的日期判断错误
  5. 添加-ErrorAction SilentlyContinue跳过无权限访问的目录,避免脚本中断

内容的提问来源于stack exchange,提问作者Wychrit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:27:34