5

我注意到如果应用配置Start-DscConfiguration失败,它会写入错误流但不会抛出异常?也就是说,如果我执行以下操作:

try{
    Start-DscConfiguration -Path ".\MyConfig" -Wait -Verbose
}catch{
    #...
}

...它永远不会在 catch 处理程序中结束。我怀疑这可能与以下事实"-Wait"有关 Start-DscConfiguration应用。

确定是否Start-DscConfiguration已成功完成的正确方法是什么?

4

3 回答 3

5

我知道的唯一方法是检查全局“$error”变量并比较调用 Start-DscConfiguration 之前和之后的错误记录数。如果之后还有更多,那么在通话期间一定出了问题,所以抛出你自己的异常:

Configuration TestErrorHandling {
    Node "localhost" {
        Script ErroringResource {
            GetScript =  { return $null; }
            TestScript = { return $false; }
            SetScript = { throw new-object System.InvalidOperationException; }
        }
    }
}

$errorCount = $error.Count;

write-host "starting dsc configuration"
$mof = TestErrorHandling;
Start-DscConfiguration TestErrorHandling –Wait –Verbose;
write-host "dsc configuration finished"

if( $error.Count -gt $errorCount )
{
    $dscErrors = $error[$errorCount..($error.Count - 1)];
    write-host "the following errors occurred during dsc configuration";
    write-host ($dscErrors | fl * | out-string);
    throw $dscErrors[-1];
}
于 2014-11-29T12:51:36.973 回答
1

还有另一种方法可以使它导致异常。尝试像这样将其保存到ErrorVariable 中

try
{
   Start-DscConfiguration -Path ".\MyConfig" -Wait -Verbose -ErrorVariable ev
}
catch
{
    $myException = $_
}

奇怪的是,当出现错误(这是您想要的)时,这会引发异常。您可以在 $myexception 变量中获取异常的值,也可以使用 $ev 获取错误的单行描述

PS:请注意,在 errorVariable 参数中提到 ev 时,您可以不使用“$”符号 - 因为您只指定变量“名称”。

于 2015-01-26T22:40:53.083 回答
0

不使用 -Wait 时使用 Start-DscConfiguration 将创建一个作业对象 - 每个计算机名都有一个子作业。PowerShell 作业对象有一个包含所有错误的错误流。您也可以查看此流

$job = Start-DscConfiguration -Force -Verbose -Path C:\Temp\Demo\ -ComputerName localhost

接收 - 工作 $job - 等待

'作业错误 = ' + ($job.childjobs[0].Error.Count)

于 2015-03-06T18:41:46.890 回答