这段代码有效吗?

时间:2018-06-07 03:06:01

标签: powershell

我有一个脚本来测试服务器是否正常运行,我的脚本运行得很好,我只是想知道它是否可以进行更多优化,还是它的方式很好?它会查找所有以特定前缀开头的服务器,在这种情况下,' PreSvr *'如果它找到其中一个启动并运行,它将停止处理其余的,并告诉我它找到的第一个的名称。如果发现这些服务器都没有响应,它会告诉我。

$found = $null
$status = $false
$SvrName = "PreSvr*"
$GetSvrs = (Get-ADComputer -Filter {Name -like $SvrName}).Name
foreach ($Svr in $GetSvrs)
{
    try {$Status = (Get-Service -ComputerName $Svr -Name WinRM -ErrorAction SilentlyContinue).Status} catch {$Status = $false}
    IF ($Status) {$Found = $Svr;break}
}

IF ($Found) {$Svr} Else {"No Server Responded"}

1 个答案:

答案 0 :(得分:0)

您正试图获取WinRM服务状态的状态,如果这是目的 - 下面的代码应该有效。你可以在try块本身内部打破。

$found = $null
$winRMServiceStatus = $null
$serverReachable = $false
$srvName = "*"
$getSvrs = (Get-ADComputer -Filter {Name -like $srvName}).Name
foreach ($svr in $getSvrs) {
    try {
        $winRMServiceStatus= (Get-Service -ComputerName $svr -Name WinRM -ErrorAction SilentlyContinue).Status
        $serverReachable = $true
        $found = $svr
        break;
    }
    catch {
        $serverReachable = $false
    }
}

if($serverReachable) {"found $found with WinRM status $winRMServiceStatus"} else{"No server responded"}

在您的示例中,您尝试访问foreach循环之外的$ srv,它不可用。

我能够在我的实验室快速测试它,让我知道它对你有用。