我当前正在尝试编写一个执行以下操作的脚本:
该脚本将在其他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”的参数。
答案 0 :(得分:0)
您的比较将始终评估为“假”,原因有两个:
-eq
操作符将测试对象的身份,而不是两个数组对象都包含相同的元素。-eq
运算符(同样,您也不能)比较数组,结果仍会 为“假”。因此,即使没有启动的服务,您的代码也会始终跳至else
分支。在这种情况下,您将向Start-Service
传递一个空变量,这将导致您观察到错误。
由于您要启动所有配置为自动启动但当前未运行的服务,因此只需使用管道即可:
Get-Service | Where-Object {
$_.StartUpType –eq 'automatic' -and
$_.Status –ne 'running'
} | Start-Service