我正在尝试创建一个脚本,该脚本将循环txt文件中列出的所有服务,检查服务启动类型是否正确(如果不正确,则更改它),并在需要时启动服务。我不太擅长Powershell,也不会真正从谷歌找到任何有用的东西。
我的文本文件:
Service A
Service B
Service C
Service D
Service E
我当前的脚本看起来是这样的,目前我能够从文本文件中打印每一个服务,但缺少下一步的信息。
$services = Get-Content .\services.txt
## Pass each service object to the pipeline and process them with the Foreach-Object cmdlet
foreach ($service in $services) {
Get-Service $service | Select-Object -Property Name, StartType, Status, DisplayName
}
困难的是每个服务都不具有相同的启动类型和状态,因此它更加复杂,例如
因此,如果服务A不是手动的并且正在运行,脚本将更改它们并给出有关更改的信息(write-host?)。
我知道我可以用命令set-service更改服务启动类型和状态,用get-service更改列表状态,但我的技能还不足以在脚本中设置。不知道这是不是可能的,或者他们是更好的方法来做这件事。
最好将服务文本文件更改为Csv文件,在该文件中不仅可以列出服务的名称,还可以列出所需的StartType和状态,如:
Service,StartType,Status Service A,Manual,Running Service B,Automatic,Running Service C,Manual,Stopped
那么您可以编写如下代码
Import-Csv -Path .\services.csv | ForEach-Object {
$changed = $false
$service = Get-Service -Name $_.Service
if ($service.StartType -ne $_.StartType) {
Write-Host "Changing StartType for service $($service.Name)" -ForegroundColor Yellow
$service | Set-Service -StartupType $_.StartType
$changed = $true
}
if ($service.Status -ne $_.Status) {
Write-Host "Changing Status for service $($service.Name)" -ForegroundColor Yellow
$service | Set-Service -Status $_.Status
$changed = $true
}
# refresh the info if you changed anything above
if ($changed) { $service = Get-Service -Name $_.Service }
# write out current status
Write-Host "Service: $($service.Name) - StartType: $($service.StartType) - Status: $($service.Status)"
}