我注意到如果通过Start-DscConfiguration
应用配置失败,它会写入错误流但不会
扔一个例外?也就是说,如果我执行以下操作:
try{
Start-DscConfiguration -Path ".\MyConfig" -Wait -Verbose
}catch{
#...
}
...它永远不会在catch处理程序中结束。我怀疑这可能与没有"-Wait"
的事实有关,
Start-DscConfiguration
为此启动异步作业,异步命令可能不会抛出异常,但在同步中
方案,我非常想知道我的配置是否可以应用。
确定Start-DscConfiguration
是否已成功完成的正确方法是什么?
答案 0 :(得分:5)
我知道的唯一方法是检查全局" $错误"变量并比较调用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];
}
答案 1 :(得分:1)
还有另一种方法可以导致异常。尝试将其保存到 ErrorVariable ,如下所示:
try
{
Start-DscConfiguration -Path ".\MyConfig" -Wait -Verbose -ErrorVariable ev
}
catch
{
$myException = $_
}
奇怪的是,这会在出现错误时抛出异常(这就是你想要的)。您可以在$ myexception变量中获取异常的值,也可以使用$ ev
获得错误的单线描述PS:请注意,虽然在errorVariable参数中提到ev,但是在没有'$'符号的情况下这样做 - 因为您只是指定变量'name'。
答案 2 :(得分:0)
在没有-Wait的情况下使用Start-DscConfiguration将创建一个作业对象 - 每个计算机名都有一个子作业。 PowerShell作业对象具有包含所有错误的错误流。你也可以检查这个流
$ job = Start-DscConfiguration -Force -Verbose -Path C:\ Temp \ Demo \ -ComputerName localhost
Receive-Job $ job -Wait
'工作中的错误=' +($ job.childjobs [0] .Error.Count)