PowerShell 服务 - 输出读数不正确
PowerShell Service - Output Reading Incorrect
正在尝试编写执行以下操作的 PowerShell 脚本:
- 寻找服务存在
- 如果找到,请检查服务状态
- 报告服务状态
- 如果服务状态不是运行正在启动服务
- 报告服务状态
问题:如果我运行脚本一次,最终服务状态会说运行ning但是之前打印的消息是它无法启动服务。如果我再次 运行 脚本,它会翻转并说服务已经启动,但最终状态是停止。
当前代码:
# 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 = 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
still 具有与以前完全相同的值(即使服务本身现在可能已将其状态更改为 Running
), else
块被执行,无论服务是否成功启动。
您需要再次调用 Get-Service
来获取服务的新值,或者(我个人最喜欢的)使用 Start-Service -PassThru
到 "update" $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 的建议,这是我的代码最终看起来的样子(就逻辑而言):
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
}
}
}
正在尝试编写执行以下操作的 PowerShell 脚本:
- 寻找服务存在
- 如果找到,请检查服务状态
- 报告服务状态
- 如果服务状态不是运行正在启动服务
- 报告服务状态
问题:如果我运行脚本一次,最终服务状态会说运行ning但是之前打印的消息是它无法启动服务。如果我再次 运行 脚本,它会翻转并说服务已经启动,但最终状态是停止。
当前代码:
# 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 = 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
still 具有与以前完全相同的值(即使服务本身现在可能已将其状态更改为 Running
), else
块被执行,无论服务是否成功启动。
您需要再次调用 Get-Service
来获取服务的新值,或者(我个人最喜欢的)使用 Start-Service -PassThru
到 "update" $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 的建议,这是我的代码最终看起来的样子(就逻辑而言):
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
}
}
}