[Solved]need help in combine If inside a Foreach statement

This topic contains 8 replies, has 3 voices, and was last updated by  Aapeli Hietikko 2 months ago.

  • Author
    Posts
  • #96632

    Lev Leiderman
    Participant

    Hi Guys,
    I can tell that after a whole month of training my mind and learning to work with Power Shell, it's my second Script that will contribute to my Organization 🙂

    the first one went yesterday for production (not something complex, since I new to scripting) and this is the second one, which is half working (lool).

    If i use only the first part of the code it's working great :

    $allpc = Get-ADComputer -Filter * -SearchBase 'ou=blah,OU=blah,OU=blah,DC=blah,DC=local'
    
    ForEach($Pc in $allpc.name) {
    
     Get-WmiObject -class Win32_Printer -ComputerName $Pc |Select-Object SystemName,name |Format-Table -AutoSize
    }
    

    it's working perfect, showing the result that I want with the columns that i need, the only problem that i have, is that for each computer that the Power Shell can't connect,

    It's showing me this horrible red errors, so I thought that I need to make Powershell something like "can't reach the pc" or something like that

    
    if ((Get-WmiObject -Class win32_printer -ComputerName $Pc.name ) -eq $false)
    
    {Write-Host "cant reach to $Pc"}
    
    

    olso i've tried to do the IF like that:

    if (Get-WmiObject -Class win32_printer -ComputerName $Pc.name -eq "$False" )
    
    {Write-Host "cant reach to $Pc"}
    
    

    Thanks alot for your help.

  • #96633

    Aapeli Hietikko
    Participant

    I think you are trying to achieve something that you shouldn't do yet 🙂 keep on reading those in a month of lunches and toolmaking books Don have made. Try – Catch is most likely the thing you are after.

    I prefer to take the data to variable so that when you hit format-table it actually does it by the longest values.

    $allpc = Get-ADComputer -Filter * -SearchBase 'ou=blah,OU=blah,OU=blah,DC=blah,DC=local'
    
    $output = ForEach($Pc in $allpc.name) {
        
        try {
            Get-WmiObject -class Win32_Printer -ComputerName $Pc -ErrorAction stop | Select-Object SystemName,name 
            }
        Catch {
            
            }
    
        }
    $output | ft
    
    • #96638

      Sam Boutros
      Participant
      $allpc = Get-ADComputer -Filter * -SearchBase 'ou=blah,OU=blah,OU=blah,DC=blah,DC=local'
      
      ForEach($Pc in $allpc.name) {
          if (Test-Connection -ComputerName $Pc -Count 2 -ErrorAction SilentlyContinue) {
              Get-WmiObject -class Win32_Printer -ComputerName $Pc | Select-Object SystemName,name | Format-Table -AutoSize
          } else {
              Write-Host "Computer '$Pc' is offline or cannot be reached"
          } 
      }
      
    • #96641

      Lev Leiderman
      Participant

      Sam,
      Thanks alot for your help,

      let me check your code..

      updated: i've checked it, and it doing actually what i wanted..

      Now i need to check about the the "try" "catch" "ErrorAction" "SilentlyContinue".

      Thanks a lot for your help guys, i have to admit that each time that i get answer here, i realise how "flexible" i can be while using Power Shell.

      I have to admit that i didn't thought to use "test-connection" inside the IF

    • #96639

      Lev Leiderman
      Participant

      Hi Aapeli,
      thanks alot for your help :).

      I will check "try" and "catch" (never saw this before...)

      I do read the books but i'm very impulsive person, so i want to know things as fast as i can 🙂

    • #96645

      Aapeli Hietikko
      Participant

      I know the pain 🙂 On a basic scripts you basically need to know only. ForEach, While (do-while), if-else, switch and try-catch and you can do anything. You can even replace switch with if-else, but that's not pretty.

    • #96702

      Lev Leiderman
      Participant

      Aapeli,

      i've read about the "try-catch" blocks and now i have one more question, i've noticed that you set the foreach statement into a variable, so that it will out-put all the content,
      my question is, why it not working if i do something like that:

      isn't it supposed to take all the content after doing all the loop?

      $allpc = Get-ADComputer -Filter * -SearchBase 'ou=Computers,OU=afula,OU=crow,DC=crow,DC=local'
      
      ForEach($Pc in $allpc.name) {
      
      try { 
      
          Get-WmiObject -class Win32_Printer -ComputerName $Pc -ErrorAction Continue -ErrorVariable x |Select-Object SystemName,name  
          }
      
         catch { 
      
       $allpc |out-file c:\err.txt -Append |Format-Table -AutoSize
       Write-Warning "cant reach to $Pc : $X" }
      
       }
      
        
      

      Thanks alot for your help

    • #96728

      Aapeli Hietikko
      Participant

      you are setting $allpc content on row1
      for each error you are dumping that content from row1 to c:\err.txt and you try to for each (pipe) that to format-table

      again this will mess up your pretty console, so I would actually drop the write-warning row away.

      
      $allpc = Get-ADComputer -Filter * -SearchBase 'ou=Computers,OU=plz,DC=change,DC=this'
      
      ForEach($Pc in $allpc.name) {
      
      try { 
      
          Get-WmiObject -class Win32_Printer -ComputerName $Pc -ErrorAction Continue -ErrorVariable x |Select-Object SystemName,name  
          
      }
      
         catch { 
      
       Write-Warning "cant reach to $Pc : $X" 
       Write-output "cant reach to $Pc : $X" | out-file c:\err.txt -Append
       }
       
       }
      
      
  • #96729

    Aapeli Hietikko
    Participant
    
    ForEach($Pc in $allpc.name) {
    
    try { 
    
        $objs = Get-WmiObject -class Win32_Printer -ComputerName $Pc -ErrorAction stop | Select-Object SystemName,name  
    
        foreach ($obj in $objs) {
            
            [PSCustomObject]@{
                'SystemName' = $obj.systemName
                'Printer'    = $obj.name
                }
            }
        }
    
    catch { 
    
                [PSCustomObject]@{
                'SystemName' = $PC
                'Printer'    = 'blah no connection'
                }
        
        }
    
     }
    
    

You must be logged in to reply to this topic.