【发布时间】:2021-03-20 20:13:07
【问题描述】:
问题:
我正在尝试通过 PowerShell 运行命令并捕获其标准输出和标准错误而不在屏幕上打印它们(命令非常嘈杂并污染控制台)。
我想在变量中捕获标准输出和标准错误,然后在找到特定字符串时抛出异常。
我的逻辑似乎在工作,我可以让 cmdlet 在我期望的时候失败/通过,但是输出与我期望的不匹配,而不是返回我指定的错误消息,我得到了我认为的而不是命令中的标准错误?
我的代码:
(为便于阅读而简化)
第一个 cmdlet:
function Test-Validation
{
[CmdletBinding()]
param(
[Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, Position = 0)]
[Array]
$ValidExitCodes = @(0),
[Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, Position = 1)]
[bool]
$FailOnWarning = $true
)
$Validation = . pdk validate 2>&1
if ($LASTEXITCODE -notin $ValidExitCodes)
{
throw "Module validation has failed. Exit code: $($LASTEXITCODE)."
}
$Warnings = $Validation -match 'pdk \(WARNING\)'
if (($Warnings) -and ($FailOnWarning -eq $true))
{
throw "Module validation contains warnings.`n$Warnings"
}
Write-Verbose "Module successfully passed validation"
}
由第二个 cmdlet 调用:
function Test-Module
{
[CmdletBinding()]
param
()
try
{
Test-Validation
}
catch
{
throw "$($_.Exception.Message)"
}
try
{
Test-Unit
}
catch
{
throw "$($_.Exception.Message)"
}
}
预期输出
PS /opt/script/test/> Test-Module
Exception: /opt/script/test/Test-Module.ps1:13:9
Line |
13 | throw "$($_.Exception.Message)"
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Module validation has failed. Exit code: 1.
实际输出
PS /opt/script/test/> Test-Module
Exception: /opt/script/test/Test-Module.ps1:13:9
Line |
13 | throw "$($_.Exception.Message)"
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| pdk (INFO): Using Ruby 2.5.8
如您所见,它似乎返回了我正在运行的命令 (pdk) 的输出,而不是我在 Test-Validation cmdlet 中定义的 "Module validation has failed. Exit code: $($LASTEXITCODE)." 消息。
为什么我没有收到我想要的错误消息,有什么方法可以让我实现我想要的吗? 除了任何代码建议外,我非常感谢任何关于我的问题的进一步阅读,以便我可以更好地理解这些事情。
注意:这是由 PoSh Core 在 MacOS 上运行的
【问题讨论】:
-
pdk是什么,它是本机命令还是 PowerShell 函数?如果是原生的,那么此问答可能适用:stackoverflow.com/q/10666101/7571258 -
pdk 是“Puppet Development Kit”,它是一个外部二进制文件,因此我对它进行了点调用。
-
感谢您的回复,很遗憾没有。事实证明这是 PowerShell Core 中的一个错误,请参阅 mklement0 的回复。再次感谢。
标签: powershell error-handling stderr