gpt4 book ai didi

powershell - 为什么 PowerShell 间歇性找不到 List[string].Add() 方法?

转载 作者:行者123 更新时间:2023-12-03 14:32:07 28 4
gpt4 key购买 nike

我有一个构建脚本(Windows 2012 R2 上的 PowerShell 4),它在后台作业中运行 NUnit 并返回 NUnit 的输出。此输出收集在 Collections.Generic.List[string] 中.

$nunitJob = Start-Job -ScriptBlock { 
param(
[string]
$BinRoot,

[string]
$NUnitConsolePath,

[string[]]
$NUnitParams,

[string]
$Verbose
)

Set-Location -Path $BinRoot
$VerbosePreference = $Verbose

Write-Verbose -Message ('{0} {1}' -f $NUnitConsolePath,($NUnitParams -join ' '))
& $NUnitConsolePath $NUnitParams 2>&1
$LASTEXITCODE
} -ArgumentList $binRoot,$nunitConsolePath,$nunitParams,$VerbosePreference

$nunitJob | Wait-Job -Timeout ($timeoutMinutes * 60) | Out-Null
$jobKilled = $false
if( $nunitJob.JobStateInfo.State -eq [Management.Automation.JobState]::Running )
{
$jobKilled = $true
$errMsg = 'Killing {0} tests: exceeded {1} minute timeout.' -f $assembly.Name,$timeoutMinutes
Write-Error -Message $errMsg
}

$output = New-Object 'Collections.Generic.List[string]'

$nunitJob |
Stop-Job -PassThru |
Receive-Job |
ForEach-Object {
if( -not $_ )
{
[void]$output.Add( '' )
return
}

switch -Regex ( $_ )
{
'^Tests run: (\d+), Errors: (\d+), Failures: (\d+), Inconclusive: (\d+), Time: ([\d\.]+) seconds$'
{
$testsRun = $Matches[1]
$errors = $Matches[2]
$failures = $Matches[3]
$inconclusive = $Matches[4]
$duration = New-Object 'TimeSpan' 0,0,$Matches[5]
break
}
'^ Not run: (\d+), Invalid: (\d+), Ignored: (\d+), Skipped: (\d+)$'
{
$notRun = $Matches[1]
$invalid = $Matches[2]
$ignored = $Matches[3]
$skipped = $Matches[4]
break
}
}

# Error happens here:
[void] $output.Add( $_ )
}

间歇性地,我们的构建将失败并显示以下错误:

Cannot find an overload for "Add" and the argument count: "1".
At line:XXXXX char:XXXXX
+ [void] $output.Add( $_ )
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest



知道为什么 PowerShell 找不到 List[string]Add方法?

我打开了一个控制台窗口并尝试将不同类型的对象传递给 Add没有得到错误。
> $o = New-Object 'Collections.Generic.List[string]'
> $o.Add( '' )
> $o.Add( $null )
> $o.Add( 1 )
> $o


1

最佳答案

当您将 stderr 重定向到 stdout 时,您可以获得穿插字符串的 System.Management.Automation.ErrorRecords。 Stderr 会自动转换为 ErrorRecords,而 stdout 是字符串。

因此,您可能希望查看输出是否包含感兴趣的 ErrorRecords,如果没有,则将其过滤掉。

关于powershell - 为什么 PowerShell 间歇性找不到 List[string].Add() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32261033/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com