从CMD运行PowerShell脚本时出现奇怪的行为

时间:2013-03-08 21:40:36

标签: powershell

在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命令返回任何警报。

有什么区别?

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。看起来使用Connect-DPMServer连接到DPM服务器与您可以看到警报之间存在轻微延迟。

我添加了一个循环到while (!$alerts)的效果,并在循环中运行refreshAlerts()alertController.ActiveAlerts。大约10秒后,我能够看到并处理活动警报。

在ISE中运行时,变量在运行之间保持不变,因此有足够的时间进行连接。当使用“powershell -file scriptname”调用时,shell会在连接发生之前退出。