解决方法:启动存储在变量中的服务

时间:2019-07-29 13:53:47

标签: powershell

我当前正在尝试编写一个执行以下操作的脚本:

  1. 获取正在运行的服务
  2. 获取所有自动运行的启动类型的服务
  3. 启动所有未运行但启动类型为自动的服务。

该脚本将在其他Windows服务器上运行。我已经尝试过将应运行的服务($servicestorun与实际运行的服务($servicesrunning)进行比较,然后启动未运行但应运行的服务。

这里有人可以向我指出正确的方向或向我提供修复它所需的代码吗?

$servicesrunning = Get-Service | Where {
     $_.StartUpType –eq 'automatic' -and $_.Status –eq 'running'
} # gets running services
$servicestorun = Get-Service | Where {
    $_.StartUpType –eq 'automatic' -and
    $_.Status –eq 'stopped'
} # gets services with startup type automatic and status stopped

# checks if all services which should run, actually run
if ($servicestorun -eq $servicesrunning) {
    echo "all good" # if positive, message all good then exit
    exit
} else {
    Start-Service $servicestorun # starts all services with startup type automatic and status stopped 
}

还有我得到的错误:

  

启动服务:参数“ InputObject”的参数。

1 个答案:

答案 0 :(得分:0)

您的比较将始终评估为“假”,原因有两个:

  • PowerShell数组是对象,-eq操作符将测试对象的身份,而不是两个数组对象都包含相同的元素。
  • 您要比较的两个列表是互斥的,因此即使您可以使用-eq运算符(同样,您也不能)比较数组,结果仍会 为“假”。

因此,即使没有启动的服务,您的代码也会始终跳至else分支。在这种情况下,您将向Start-Service传递一个空变量,这将导致您观察到错误。

由于您要启动所有配置为自动启动但当前未运行的服务,因此只需使用管道即可:

Get-Service | Where-Object {
    $_.StartUpType –eq 'automatic' -and
    $_.Status –ne 'running'
} | Start-Service