Import-csv, Psremoting, tjek if service is stopped and start it

This topic contains 3 replies, has 3 voices, and was last updated by Profile photo of Don Jones Don Jones 1 year, 8 months ago.

  • Author
    Posts
  • #23819
    Profile photo of TechGismo
    TechGismo
    Participant

    Hello PowerShell Scripting supporters

    I need help with this little script.

    I would like to import a csv file containing a list of servers where I want tjek if a specific service is running and if it is not then start this service. Show the result in powershell

    $Serverlist = Import-Csv C:\Path-To-Severlist.csv
    
    Get-ChildItem $Serverlist | ForEach-Object  Invoke-Command -ScriptBlock { Get-service -Name BackupExecAgentAccelerator } 
    
    If {$_.Status -eq "stopped" -then Start-Service -Name BackupExecAgentAccelerator} | Format-Table name,status,ComputerName

    I did also had an idea that the approach beneath could work, but I need some to get on the right track here.

    $Serverlist = C:\Path-to-file.csv
    ForEach-Object { $_.Serverlist New-PSSession }
    Invoke-Command -Session $servelist -ScriptBlock { Get-service -Name BackupExecAgentAccelerator } | Format-Table name,status,PsComputerName
    
    If {$_.Status -eq "stopped" -then Start-Service -Name BackupExecAgentAccelerator}
    
  • #23827
    Profile photo of Don Jones
    Don Jones
    Keymaster

    So... if $ServerList is a CSV file, I'm not sure why Get-ChildItem is in use. Get-ChildItem doesn't read the contents of a file... I'm not sure what your intent was, there. Maybe I don't understand the question. But you're using $_ in some places that make no sense to me, I'm unsure why Format-Table is involved, and I don't see where you're passing a computer name to Invoke-Command.

    Let's maybe start over.

    If ServerList.csv looks like:

    ComputerName
    SERVER1
    SERVER2
    

    This assumes I have a column header named "ComputerName," which lets me reference the column. Then...

    $ServerList = Import-CSV ServerList.csv
    foreach ($Server in $ServerList) {
      $ComputerName = $Server.ComputerName
      Invoke-Command -ComputerName $ComputerName -ScriptBlock { 
        $service = Get-Service -Name BackupExecAgentWhateverThing
        if ($service.status -ne 'Running') { 
          Start-Service -Name BackupThingAgentExectWhatever
        }
      }
    }
    

    That's the long way.

    Invoke-Command -ScriptBlock { Start-Service -Name AgentBackupExecThing } -ComputerName (Import-CSV serverlist.csv | Select -expand ComputerName)
    

    Would be the short way. You'd get errors for ones where the service was already started, since I didn't actually check first on that second example, but hopefully that's an illustration.

  • #23834
    Profile photo of Tech Gismo
    Tech Gismo
    Participant

    Thanks for the help:

    You did understand the question.

    My issue is that foreach-object and get-childitem confuses me a lot. And also when to use { } or when to use ( ).

    The format-table, was something I used in another script with PSremoting, where I had listed of a few servers comma-seperated, so in order to make it look nice I added the Format-table.

    Btw, I don't mind taking the long way as long as I learn something during that process. Thats the most important thing for me right now regarding powershell.

    I'm very happy that you didn't replaced Foreach with a % sign.

    And thank you so much for your help.

    Kind regard
    TechGismo

  • #23835
    Profile photo of Don Jones
    Don Jones
    Keymaster

    ForEach-Object: Takes one or more object, and runs a hunk of code [i]for each object[/i] you give it. It is *NOT* the same as the ForEach language construct, although they have the same purpose.

    Get-ChildItem: Gets a directory listing. It's the real command behind "dir."

    {} encloses executable code. () encloses an expression. More on that in a minute.

    Be really careful with formatting – see "The Big Book of PowerShell Gotchas." Formatting can break more than it fixes when it's in a script.

    And I am not a huge fan of % as an alias, at least not when I'm trying to explain stuff ;).

    {} and () confuses everybody. () is for expressions you want evaluated first – just like in math. For example:

    if (5 -gt 10) { Do-This }
    

    The () gets evaluated first, so this simplifies to (this isn't real code, but it's what goes in in PowerShell's head):

    if $false { Do-This }
    

    OK, it's False, so I won't Do-This. The {} is a hunk of code – it's what would have executed had the expression been True. It's contained in {} so PowerShell can tell where the code begins and ends.

You must be logged in to reply to this topic.