PowerShell服务 - 输出读取不正确

时间:2016-01-13 17:27:25

标签: powershell logging service output

尝试编写执行以下操作的PowerShell脚本:

  1. 寻找服务存在
  2. 如果找到,请检查服务状态
  3. 报告服务状态
  4. 如果服务状态未运行,则启动服务
  5. 报告服务状态
  6. 问题: 如果我运行一次脚本,最终的服务状态将显示正在运行,但之前打印的消息将是无法启动服务。如果我再次运行脚本,它将翻转并说服务已经启动,但最终状态已停止。

    当前代码:

    # Setting variables
    
    $date = Get-Date # setting date
    $LogFile = "$env:UserProfile\Desktop\Log.txt" # setting log file - change as needed
    $ServiceName = "Spooler" # setting service name - change as needed
    $arrService = Get-Service -Name $ServiceName
    $arrServiceCheck = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue -ErrorVariable NoService
    
    
    <# =============== DO NOT CHANGE ANYTHING BELOW THIS POINT =============== #>
    
    # Creating functions for re-use throughout script
    
    function CurrentServiceStatus {
        Write-Output "Status of '$ServiceName' service:" | Out-File $LogFile -append
        Get-Service $ServiceName | Select Name,DisplayName,Status | Format-List | Out-File $LogFile -append
    }
    
    # Starting script operation
    
    Write-Output "=========================================================================" | Out-File $LogFile
    Write-Output "    Starting '$ServiceName' Service Monitor Script on $date" | Out-File $LogFile -append
    Write-Output "=========================================================================" | Out-File $LogFile -append
    Write-Output " " | Out-File $LogFile -append
    
    # Looking for service. If service was found, checking it's status. If status is not running, starting the service.
    
    if ($arrServiceCheck){
        Write-Output "'$ServiceName' service found on $env:ComputerName..." | Out-File $LogFile -append
        Write-Output " " | Out-File $LogFile -append
    
        ServiceStatus
    
        if ($arrService.Status -ne "Running"){
            Start-Service $ServiceName | Out-File $LogFile -append
        }
    
        if ($arrService.Status -eq "Running"){
            Write-Output "$date - '$ServiceName' started..." | Out-File $LogFile -append
            Write-Output " " | Out-File $LogFile -append
            ServiceStatus
        }
        else{
            Write-Output "Error: '$ServiceName' service could not be started..." | Out-File $LogFile -append
            Write-Output " " | Out-File $LogFile -append
            ServiceStatus
        }
    }
    
    # If service was not found, making note of it to log file
    
    if ($NoService){
        Write-Output " " | Out-File $LogFile -append
    Write-Output $NoService[0].exception.message | Out-File $LogFile -append
        Write-Output " " | Out-File $LogFile -append
    }
    
    # Completing running of script
    
    Write-Output "=========================================================================" | Out-File $LogFile -append
    Write-Output "    Finished '$ServiceName' Service Monitor Script on $date" | Out-File $LogFile -append
    Write-Output "=========================================================================" | Out-File $LogFile -append
    Write-Output " " | Out-File $LogFile -append
    Write-Output " " | Out-File $LogFile -append
    

    这是我的输出......

    运行1:

    =========================================================================
        Starting 'Spooler' Service Monitor Script on 01/13/2016 12:06:49
    =========================================================================
    
    'Spooler' service found on MW762OXI5K7M8D...
    
    Current status of 'Spooler' service:
    
    
    Name        : Spooler
    DisplayName : Print Spooler
    Status      : Stopped
    
    
    
    01/13/2016 12:06:49 - 'Spooler' started...
    
    Final status of 'Spooler' service:
    
    
    Name        : Spooler
    DisplayName : Print Spooler
    Status      : Stopped
    
    
    
    =========================================================================
        Finished 'Spooler' Service Monitor Script on 01/13/2016 12:06:49
    =========================================================================
    

    运行2:

    =========================================================================
        Starting 'Spooler' Service Monitor Script on 01/13/2016 12:15:58
    =========================================================================
    
    'Spooler' service found on MW762OXI5K7M8D...
    
    Current status of 'Spooler' service:
    
    
    Name        : Spooler
    DisplayName : Print Spooler
    Status      : Stopped
    
    
    
    'Spooler' service could not be started...
    
    Final status of 'Spooler' service:
    
    
    Name        : Spooler
    DisplayName : Print Spooler
    Status      : Running
    
    
    
    =========================================================================
        Finished 'Spooler' Service Monitor Script on 01/13/2016 12:15:58
    =========================================================================
    

    ==========================================

    以下是更正后的代码:

    # Setting variables
    
    $date = Get-Date # setting date
    $LogFile = "$env:UserProfile\Desktop\NXLogMonitor\Logging\NXLogMonitor.txt"    # setting log file - change as needed
    $ServiceName = "Spooler" # setting service name - change as needed
    $arrService = Get-Service -Name $ServiceName
    $arrServiceCheck = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue -ErrorVariable NoService
    
    
    <# =============== DO NOT CHANGE ANYTHING BELOW THIS POINT =============== #>
    
    # Creating functions for re-use throughout script
    
    function ServiceStatus {
        Write-Output "Status of '$ServiceName' service:" | Out-File $LogFile -append
        Get-Service $ServiceName | Select Name,DisplayName,Status | Format-Table -AutoSize | Out-File $LogFile -append
    }
    
    # Starting script operation
    
    Write-Output "=========================================================================" | Out-File $LogFile
    Write-Output "    Starting '$ServiceName' Service Monitor Script on $date" | Out-File $LogFile -append
    Write-Output "=========================================================================" | Out-File $LogFile -append
    Write-Output " " | Out-File $LogFile -append
    
    # Looking for service. If service was found, checking it's status. If status is not running, starting the service.
    
    if ($arrServiceCheck){
        Write-Output "'$ServiceName' service found on $env:ComputerName..." | Out-File $LogFile -append
        Write-Output " " | Out-File $LogFile -append
    
        if ($arrService.Status -eq "Running"){
            Write-Output "'$ServiceName' is already started..." | Out-File $LogFile -append
            Write-Output " " | Out-File $LogFile -append
            ServiceStatus
        }
    
        if ($arrService.Status -ne "Running"){
            Write-Output "'$ServiceName' service is not started..." | Out-File $LogFile -append
            Write-Output " " | Out-File $LogFile -append
    
            ServiceStatus
    
            $arrService = Start-Service $ServiceName -PassThru
            if ($arrService.Status -eq "Running"){
                Write-Output "$date - '$ServiceName' service started..." | Out-File $LogFile -append
                Write-Output " " | Out-File $LogFile -append
                ServiceStatus
            }
            elseif ($arrService.Status -ne "Running"){
                Write-Output "Error: '$ServiceName' service could not be started..." | Out-File $LogFile -append
                Write-Output " " | Out-File $LogFile -append
                ServiceStatus
            }
        }
    }
    
    # If service was not found, making note of it to log file
    
    if ($NoService){
        Write-Output " " | Out-File $LogFile -append
    Write-Output $NoService[0].exception.message | Out-File $LogFile -append
        Write-Output " " | Out-File $LogFile -append
    }
    
    # Completing running of script
    
    Write-Output "=========================================================================" | Out-File $LogFile -append
    Write-Output "    Finished '$ServiceName' Service Monitor Script on $date" | Out-File $LogFile -append
    Write-Output "=========================================================================" | Out-File $LogFile -append
    Write-Output " " | Out-File $LogFile -append
    Write-Output " " | Out-File $LogFile -append
    

    以下是更正后代码的输出:

    =========================================================================
        Starting 'Spooler' Service Monitor Script on 01/13/2016 13:53:08
    =========================================================================
    
    'Spooler' service found on MW762OXI5K7M8D...
    
    'Spooler' is already started...
    
    Status of 'Spooler' service:
    
    Name    DisplayName    Status
    ----    -----------    ------
    Spooler Print Spooler Running
    
    
    =========================================================================
        Finished 'Spooler' Service Monitor Script on 01/13/2016 13:53:08
    =========================================================================
    

2 个答案:

答案 0 :(得分:2)

仔细看看你刚开始做的事情:

$arrService = Get-Service -Name $ServiceName

$arrService.Status现在反映了之前服务的状态 - 让我们想象状态是Stopped

然后,在您的脚本中稍后:

if ($arrService.Status -ne "Running"){
    Start-Service $ServiceName | Out-File $LogFile -append
}

此部分按预期工作 - 启动脚本时服务未运行,因此它现在就开始了,太棒了!

然后是你脚本中有问题的部分:

if ($arrService.Status -eq "Running"){
       Write-Output "$date - '$ServiceName' started..." | Out-File $LogFile -append
       Write-Output " " | Out-File $LogFile -append
       FinalServiceStatus
}
else{
    Write-Output "Error: '$ServiceName' service could not be started..." | Out-File $LogFile -append
    Write-Output " " | Out-File $LogFile -append
    FinalServiceStatus
}

由于$arrService.Status 仍然具有与之前完全相同的值(即使服务本身现在可能已将其状态更改为Running),else无论服务是否成功启动,都会执行块。

您需要再次致电Get-Service 以获取服务的新价值,或者(我个人最喜欢的)使用Start-Service -PassThru来“更新”{{1}变量:

$arrService

答案 1 :(得分:0)

对于任何有兴趣的人,根据Mathias的建议,这就是我的代码最终看起来的样子(就逻辑而言):

if ($arrServiceCheck){
    Write-Output "'$ServiceName' service found on $env:ComputerName..." | Out-File $LogFile -append
    Write-Output " " | Out-File $LogFile -append

    if ($arrService.Status -eq "Running"){
           Write-Output "'$ServiceName' is already started..." | Out-File $LogFile -append
           Write-Output " " | Out-File $LogFile -append
           FinalServiceStatus
}

    if ($arrService.Status -ne "Running"){
        CurrentServiceStatus
        $arrService = Start-Service $ServiceName -PassThru
        if ($arrService.Status -eq "Running"){
           Write-Output "$date - '$ServiceName' started..." | Out-File $LogFile -append
           Write-Output " " | Out-File $LogFile -append
           FinalServiceStatus
        }
        elseif ($arrService.Status -ne "Running"){
           Write-Output "Error: '$ServiceName' service could not be started..." | Out-File $LogFile -append
           Write-Output " " | Out-File $LogFile -append
           FinalServiceStatus
        }
    }
}