提问者:小点点

从txt文件循环服务,根据需要更改启动类型,根据需要启动


我正在尝试创建一个脚本,该脚本将循环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需要手动并正在运行
  • 服务B需要自动运行
  • 服务C需要手动并停止

因此,如果服务A不是手动的并且正在运行,脚本将更改它们并给出有关更改的信息(write-host?)。

我知道我可以用命令set-service更改服务启动类型和状态,用get-service更改列表状态,但我的技能还不足以在脚本中设置。不知道这是不是可能的,或者他们是更好的方法来做这件事。


共1个答案

匿名用户

最好将服务文本文件更改为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)"
}