在ISE和CMD提示符下运行PowerShell脚本时,我遇到了行为上的差异。
该脚本的目的是检查Microsoft DPM(数据保护管理)服务的活动警报。如果发现超过12小时的内容,则会在“DPM警报”事件日志中记录错误。
我在ISE中开发了脚本,它似乎完美无缺。所以我把它添加到计划任务,它没有做我想要的。我最终剥离了测试警报年龄的逻辑,因此我所做的就是尝试获取当前活动警报的列表。
$serverName = "my_server_name"
$dpmServer = Connect-DPMServer $serverName
$dpmServer.AlertController.RefreshAlerts()
$activeAlerts = $dpmServer.AlertController.ActiveAlerts
if (!$activeAlerts) {"no active alerts found"}
else {$activeAlerts}
我正在通过PSConsoleFile加载DPM管理单元。我从CMD执行的命令如下所示:
powershell -psconsole .\DPMConsoleFile.psc1 -file .\DPMAlertChecker.ps1�
我知道管理单元正确加载,因为如果我包含一行只显示$ dpmServer对象,它会显示正确的信息。
如果我从PowerShell ISE(或DPM Management Shell)运行它,它可以正常工作并显示活动警报列表(如果有)。如果我使用上面的语法从命令行运行它,它不起作用。具体来说,它不会从$dpmServer.alertcenter.activealerts
命令返回任何警报。
有什么区别?
答案 0 :(得分:0)
我发现了这个问题。看起来使用Connect-DPMServer
连接到DPM服务器与您可以看到警报之间存在轻微延迟。
我添加了一个循环到while (!$alerts)
的效果,并在循环中运行refreshAlerts()
和alertController.ActiveAlerts
。大约10秒后,我能够看到并处理活动警报。
在ISE中运行时,变量在运行之间保持不变,因此有足够的时间进行连接。当使用“powershell -file scriptname”调用时,shell会在连接发生之前退出。