我正在编写用于 Active Directory 监控的 sysvol 检查脚本。已完成检查给定域中所有域控制器上 sysvol 连接性的脚本。作为此操作的一部分,我正在执行以下检查
Start-Job -sb "(Measure-Command{Dir \\$DCName\sysvol\$Domain\Policies}).Milliseconds"
这将返回所花费的时间(以毫秒为单位);不幸的是,即使 sysvol 无法访问,它也会返回时间,并且由于显而易见的原因,与可访问时相比,它的速度甚至更快。
我的问题是,当我执行接收作业时,有没有办法找出作业是否有错误?因为测量命令无法提供完整的信息。如果对此还有其他问题,请告诉我。
答案1
首先,我不明白你的语法。我在 Windows 10 上运行 PS v5,你的代码片段甚至无法运行,因为你输入的是Start-Job
字符串,而不是脚本块。对我-sb
来说,这不是一个可接受的别名/简写-ScriptBlock
。
但谁知道呢,也许这在 PS v4 中是合法的。这不是重点。
您应该将其添加-ErrorAction Stop
到您的dir
// cmdlet 中gci
,get-childitem
以便它在失败时产生“终止”错误。
请注意,当我没有指定时,工作如下-ErrorAction Stop
:
PS C:\> $MyJob = Start-Job -ScriptBlock { (Measure-Command{Dir \\$DCName\sysvol\$Domain\Policies}).Milliseconds }
PS C:\> $MyJob.State
Running
PS C:\> $MyJob.State
Completed
我不知道该作业实际上是成功还是失败了。无论作业是否成功,作业状态都只是从“正在运行”变为“已完成”。
现在让我们用终止错误再试一次:
PS C:\> $MyJob = Start-Job -ScriptBlock { (Measure-Command{Dir \\$DCName\sysvol\$Domain\Policies -ErrorAction Stop}).Milliseconds }
PS C:\> $MyJob.State
Running
PS C:\> $MyJob.State
Failed
现在您看到同一项作业进入失败状态。您现在知道您的作业失败了。此外,如果您要使用
PS C:\> $Result = Receive-Job $MyJob
$Result
如果作业失败则将为空。
如果您想存储作业中发生的具体错误,请尝试以下操作:
PS C:\> Receive-Job $MyJob -ErrorVariable Result
PS C:\> $Result
Cannot find path '\\\sysvol\\Policies' because it does not exist.
+ CategoryInfo : ObjectNotFound: (\\\sysvol\\Policies:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
+ PSComputerName : localhost