如何去除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
相关产品推荐
相关产品推荐

