【问题标题】:Scheduled task restart service with dependent services有依赖服务的定时任务重启服务
【发布时间】:2015-09-01 04:48:30
【问题描述】:

我有一个用作打印服务器的 Windows 2008 R2 服务器。

该服务器上发生的几乎所有问题都可以通过重新启动 Print Spooler 服务来解决。

我想出了一个每天晚上自动重启服务的计划,我发现了这个命令:

Powershell.exe -ExecutionPolicy Bypass -Command { Restart-Service -Name spooler }

问题是我的 spooler 有三个依赖于它的服务,所以这个命令不起作用。在“spooler”之后添加 -force 命令是否安全,或者有其他方法吗?

【问题讨论】:

  • 请注意,您在使用-Command 时不需要指定执行策略,因为执行策略适用于脚本(文件)。
  • @HarryJohnston 如果我使用net stop spooler,我会列出依赖服务,需要输入yes 才能继续。我可以做net stop spooler /ynet start spooler,但是依赖服务需要手动启动。我也不喜欢硬编码这些的开头,因为它们可能会随着时间而改变。

标签: windows powershell printing scheduled-tasks


【解决方案1】:

重新启动具有依赖关系的服务需要先停止依赖服务。有一个带有示例代码的Dell KB article。万一链接坏了,稍微调一下的版本是这样的,

# Service to be restarted
$restartedService = "FooBar"

# Get service dependencies
$dependents = (get-service $restartedService).dependentservices  

# information about dependent services
$dependentservices = gwmi Win32_Service | Select-object name,state,startmode | ? {$dependents.name -contains $_.name}

# Stop dependencies
Write-Host "Stopping Services" -f Yellow

foreach ($service in $dependentservices){

Write-Host "`r`nAnalyzing $($service.name)" -f Yellow

    if($service.startmode -eq "auto" -or $service.status -eq "Running"){
        Write-Host "Stopping $($service.name)"
        stop-service $service.name
    } else{
        "$($service.name) is $($service.state) with the startmode: $($service.startmode)"
    }
}

# Stop the service
stop-service $restartedService -force

Write-Host "Starting Services" -f Yellow

# start dependencies
foreach ($service in $dependentservices){

    Write-Host "`r`nAnalyzing $($service.name)" -f Yellow

    if($service.startmode -eq "auto"){
        "Starting $($service.name)"
        start-service $service.name
    } else{
        "$($service.name) is $($service.state) with the startmode: $($service.startmode)"
    }
}

# start service
start-service $restartedService

【讨论】:

  • 我认为您的意思是“重新启动具有依赖服务的服务”? (依赖是你的服务需要的服务,依赖的服务是需要你的服务的服务。)
  • @vonPryz 脚本好像有问题.. 依赖服务没有启动。
  • @user3332631 您的依赖服务是否设置为自动启动$service.startmode -eq "auto"?
  • @JanChrbolka 是的。 Write-Host "rnAnalyzing $($service.name)" -f Yellow这行没有写出三个依赖服务,只有Analyzing一行。我检查了命令(get-service $restartedService).dependentservices 是否按预期返回服务。 foreach 循环似乎有问题。
【解决方案2】:

要重新启动具有依赖关系的服务,在最新版本的 PowerShell(v5 及更高版本)中,您只需包含 -Force 标志。

如下面的带有/不带有标志的示例:

PS C:\Temp> Restart-Service -Name "nlasvc"
Restart-Service : Cannot stop service 'Network Location Awareness (nlasvc)' because it has dependent services.
It can only be stopped if the Force flag is set.
At line:1 char:1
+ Restart-Service -Name "nlasvc"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (System.ServiceProcess.ServiceController:ServiceController) [Restart-Service], ServiceCommandException
+ FullyQualifiedErrorId : ServiceHasDependentServices,Microsoft.PowerShell.Commands.RestartServiceCommand

PS C:\Temp> Restart-Service -Name "nlasvc" -Force
PS C:\Temp>

根据 Stop-ServiceRestart-Service 的 PowerShell 参考资料。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 2016-07-02
    • 2015-09-03
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多