Почему меняются все сервисы, а не просто сервис if condition? - PullRequest
0 голосов
/ 06 декабря 2018

Я пишу скрипт, который будет передавать две переменные и файл CSV для изменения служб на компьютере, указанном в файле CSV.

команда будет в следующем формате: напр.start SQLService или stop PBIService

данный файл CSV:

сервер, служба

сервер1, SQLService

сервер2, PBIService

server3, PBIService

param($task, $service) #arguments from cmd line input

if($task -eq "start")
{
    Set-Variable -Name "task" -Value "running"
}
elseif($task -eq "stop")
{
    Set-Variable -Name "task" -Value "stopped"
}

if($service -eq "SQLService")
{
    Set-Variable -Name "SQLsvc" -Value "SQLService"
}
elseif($service -eq "PBIService")
{
    Set-Variable -Name "PBIsvc" -Value "PBIService"
}

Import-CSV .\csvfile.csv |
    ForEach {
        if($_.service -eq "SQLService")
        {
            $getService = Get-Service $SQLsvc -ComputerName $_.Server
            $oldstatus = $getService.status
            $getService | 
            Set-Service -Status $task -PassThru |
                Select MachineName, Name, Status, 
                    @{n='OldStatus';e={$oldStatus}}
        }
        elseif($_.Service -eq "PBIService")
        {
            $getService = Get-Service $PBIsvc -ComputerName $_.Server
            $oldstatus = $getService.status
            $getService | 
            Set-Service -Status $task -PassThru |
                Select MachineName, Name, Status, 
                    @{n='OldStatus';e={$oldStatus}}
        }
    } |
    tee output.txt

Однако, когда я запускаю это по какой-то причине, это затрагивает ВСЕ службы ...

MachineName                    Name                    Status OldStatus
-----------                    ----                    ------ ---------
server1                         SQLService          Running   Running
server2                         PBIService          Running   Running
Set-Service : Service 'Microsoft Monitoring Agent Audit Forwarding (AdtAgent)' cannot be started due to the following
error: Cannot start service AdtAgent on computer 'server3'.
+             Set-Service -Status $task -PassThru |
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Set-Service], Se
   rviceCommandException
    + FullyQualifiedErrorId : CouldNotStartService,Microsoft.PowerShell.Commands.SetServiceCommand

server3 AdtAgent               Stopped ...ed...}
Set-Service : Service 'AllJoyn Router Service (AJRouter)' cannot be started due to the following error: Cannot start
service AJRouter on computer 'server3'.
+             Set-Service -Status $task -PassThru |
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Set-Service], Se
   rviceCommandException
    + FullyQualifiedErrorId : CouldNotStartService,Microsoft.PowerShell.Commands.SetServiceCommand

server3 AJRouter               Stopped ...ed...}

Кроме того, почему, если я командую start SQLService, PBIService тоже запускается?по какой-то причине условие не работает должным образом ... единственным затронутым сервером и службой в этом случае должен быть server1, поскольку согласно условию if этот сервер имеет service = SQLService

1 Ответ

0 голосов
/ 06 декабря 2018

Внутри foreach вы не проверяете то, что было передано в качестве аргумента.

Я предлагаю обрабатывать только те строки из csv, которые соответствуют переданным $Service

Import-CSV .\csvfile.csv | Where-Object Service -eq $Service |

Такжеблоки скриптов в if / elseif идентичны, кроме $SQLsvc / $PBIsvc, которые ОБА происходят из переданного $ service, поэтому могут быть объединены и напрямую использовать $ service

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...