【问题标题】:Why are all services being changed instead of just the if condition service?为什么要更改所有服务而不只是 if 条件服务?
【发布时间】:2018-12-06 18:47:07
【问题描述】:

我正在编写一个脚本,它将传入两个变量和一个 csv 文件,以更改 csv 文件中列出的计算机上的服务。

命令将采用以下格式:例如。 start SQLServicestop PBIService

给定 csv 文件:

服务器,服务

server1,SQLService

server2,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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    在 foreach 中,您不会检查作为参数传递的内容。

    我建议只处理 csv 中与传递的 $Service 匹配的行

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

    if/elseif 中的脚本块除了 $SQLsvc/$PBIsvc 之外是相同的,其中 BOTH 源于传递的 $service,因此可以合并并直接使用 $service

    【讨论】:

    • 太棒了!是的,这就是我所缺少的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2011-07-20
    • 2016-08-22
    • 2015-04-17
    • 2019-08-28
    • 1970-01-01
    • 2015-03-29
    相关资源
    最近更新 更多