【问题标题】:PowerShell Service - Output Reading IncorrectPowerShell 服务 - 输出读数不正确
【发布时间】:2016-01-13 17:27:24
【问题描述】:

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

  1. 寻找服务存在
  2. 如果找到,检查服务状态
  3. 报告服务状态
  4. 如果服务状态不是运行启动服务
  5. 报告服务状态

问题:如果我运行一次脚本,最终服务状态会显示正在运行,但之前打印的消息是无法启动服务。如果我再次运行脚本,它会触发并说服务已启动,但最终状态已停止。

当前代码:

# 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
=========================================================================

【问题讨论】:

  • $arrService.Status 在不同的 if/else 语句之间不会改变,它在整个脚本中保持不变。再次运行Get-Service,而不是检查和“旧”变量值

标签: powershell logging service output


【解决方案1】:

好好看看你一开始做了什么:

$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来“更新”$arrService变量:

if($arrService.Status -ne 'Running')
{
    $arrService = Start-Service $ServiceName -PassThru
}

if($arrService.Status -eq 'Running')
{
    "Service is running" # although we don't know whether it was just started or already had been 
}
else
{
    "Service not running, starting must have failed"
}

【讨论】:

  • 谢谢你,@Mathias。在你的帮助下,我得到了它。完全错过了这一点,但绝对理解这可能是一个问题。 -passthru 开关也很不错:)。现在,如果我能得到正确的格式......
  • 这是一个不同的问题(请随时提出新问题)。提示:不要使用Format-List,它会添加不需要的换行符。
  • 知道了。感谢您帮助解决最大的问题@Mathias。
【解决方案2】:

对于任何感兴趣的人,根据 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
        }
    }
}

【讨论】:

    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 2013-09-22
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2018-09-13
    相关资源
    最近更新 更多