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

如何去除PowerShell自定义函数运行输出开头多余的0、1数字

问题原因

你看到的开头0、1是[System.Collections.ArrayList]的Add()方法的返回值,该方法执行后会返回新插入元素的下标索引,而PowerShell默认会将所有未被捕获的返回值都加入函数的输出流,所以这两个索引值会和你最终要返回的文件列表一起输出,并非ArrayList内部存在多余元素。


解决方法

你可以任选以下任意一种方案实现需求:

方案1:捕获Add方法的返回值,避免流入输出流

只需要修改调用$answer.Add($arr)的行,把返回值屏蔽即可,可选写法有三种:

  • 用[void]强制转换丢弃返回值:[void]$answer.Add($arr)
  • 将返回值赋值给$null:$null = $answer.Add($arr)
  • 管道输出到Out-Null:$answer.Add($arr) | Out-Null

改完后的完整函数示例:

function Find-FooBars
{
  [CmdletBinding()]
  [OutputType([array])]
  param
  (
    [string]$appname,
    [string]$eventsId
  )
  $machines = @("server1", "server2")
  $rx = -join ($eventsId, "_.*\.json")
  $answer = [System.Collections.ArrayList]@()
  foreach ($machine in $machines)
  {
    $dir = -join ("\\", $machine, "\c$\Applications\", $appname, "\logs\alerts")
    $arr = Get-ChildItem $dir -Recurse |
      Where-Object { $_.Name -match $rx } |
      Select-Object @{ n = 'LastWriteTime'; e = { $_.LastWriteTime } }, @{ n = 'FullName'; e = { $_.FullName } }
    # 屏蔽Add方法的返回值
    [void]$answer.Add($arr)
  }
  $answer | Sort-Object -Property LastWriteTime
}

方案2:改用PowerShell原生数组,避免该问题

你也可以不用ArrayList,直接用PowerShell原生的数组累加,不需要处理返回值:

function Find-FooBars
{
  [CmdletBinding()]
  [OutputType([array])]
  param
  (
    [string]$appname,
    [string]$eventsId
  )
  $machines = @("server1", "server2")
  $rx = -join ($eventsId, "_.*\.json")
  # 初始化空数组
  $answer = @()
  foreach ($machine in $machines)
  {
    $dir = -join ("\\", $machine, "\c$\Applications\", $appname, "\logs\alerts")
    $arr = Get-ChildItem $dir -Recurse |
      Where-Object { $_.Name -match $rx } |
      Select-Object @{ n = 'LastWriteTime'; e = { $_.LastWriteTime } }, @{ n = 'FullName'; e = { $_.FullName } }
    # 数组累加
    $answer += $arr
  }
  $answer | Sort-Object -Property LastWriteTime
}

方案3:直接输出结果不需要中间集合

PowerShell的流程控制语句也会自动收集输出,你可以完全省略中间的集合变量,写法更简洁:

function Find-FooBars
{
  [CmdletBinding()]
  [OutputType([array])]
  param
  (
    [string]$appname,
    [string]$eventsId
  )
  $machines = @("server1", "server2")
  $rx = -join ($eventsId, "_.*\.json")
  foreach ($machine in $machines)
  {
    $dir = -join ("\\", $machine, "\c$\Applications\", $appname, "\logs\alerts")
    Get-ChildItem $dir -Recurse |
      Where-Object { $_.Name -match $rx } |
      Select-Object LastWriteTime,FullName
  } | Sort-Object -Property LastWriteTime
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:54:03