Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 98
  • Last Modified:

issue with beginner powershell script.

Hello,
I am new to powershell. this is my learning script. I created try and catch and in the catch it suppose to create file with failed computers.
Below is the line. It created failedcomp.txt but it is empty. "Notonline" computer name should be there because this computer doesn't exist.
 $computer = out-file failedcomp.txt
please help
0
creative555
Asked:
creative555
1 Solution
 
creative555Author Commented:
Function Get-DJOSInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true,
        ValueFromPipeline=$true,
        ValueFromPipelineByPropertyName=$true)]
    [Alias('hostname')]
    [string[]]$ComputerName,
    [switch]$nameLog

)
Begin {
   if ($nameLog)
   {
       Write-Verbose "Finding name log file"
       $i = 0
    do {
    $logFile = "names-$i.txt"
    $i++
    } while (Test-Path $logFile)
    Write-verbose "Log file name will be stored $logfile"

    }
else {
write-verbose "Name logging off"
   } 


}
Process {
    if ($nameLog)
    {
        Write-Verbose "Name log on"
    }
    else
    {
       Write-Verbose "Name log off" 
    }

    foreach ($computer in $computername) {
    Write-Verbose "Now connecting to $computer"
    if ($nameLog){
    $computer | out-file $logFile -Append
    }

    try {
            $continue = $true
            $os = Get-WmiObject -ErrorAction 'Stop' -ComputerName $computer -class Win32_OperatingSystem |
            Select Caption,BuildNumber,OSArchitecture,ServicePackMajorVersion

        } catch {
            Write-Verbose "Connection to $computer failed"
            $continue = $false
            $computer = out-file failedcomp.txt
        }

        if ($continue) {
            Write-Verbose "Connection to $computer succeeded"
            $bios = Get-WmiObject -ComputerName $computer -Class Win32_BIOS |
                Select SerialNumber
            $processor = Get-WmiObject -ComputerName $computer -Class Win32_Processor |
                Select AddressWidth -first 1
            $osarchitecture = $os.osarchitecture -replace '-bit',''
            $properties = @{'ComputerName'=$computer;
                            'OSVersion'=$os.Caption;
                            'OSBuild'=$os.BuildNumber;
                            'OSArchitecture'=$osarchitecture;
                            'OSSPVersion'=$os.servicepackmajorversion;
                            'BIOSSerial'=$bios.SerialNumber;
                            'ProcArchitecture'=$processor.addresswidth}
            $obj = New-Object -TypeName PSObject -Property $properties
            Write-Output $obj
            }
 
}

}

End {}


}



Get-DJOSInfo -computername server01, notonline, server02.testtarget.local -Verbose -nameLog

Open in new window

0
 
David Johnson, CD, MVPOwnerCommented:
$computer = out-file failedcomp.txt change to
$computer | Out-File FailedComp.txt -Append
fixed and added output to csv
Function Get-DJOSInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true,
        ValueFromPipeline=$true,
        ValueFromPipelineByPropertyName=$true)]
    [Alias('hostname')]
    [string[]]$ComputerName,
    [switch]$nameLog

  )
  Begin {
    if ($nameLog)
    {
       Write-Verbose "Finding name log file"
       $i = 0
      do {
        $logFile = "names-$i.txt"
        $i++
      } while (Test-Path $logFile)
      Write-verbose "Log file name will be stored $logfile"

    }
    else {
      write-verbose "Name logging off"
    } 


  }
  Process {
  $namesobj = @()
    if ($nameLog)
    {
        Write-Verbose "Name log on"
    }
    else
    {
       Write-Verbose "Name log off" 
    }

    foreach ($computer in $computername) {
      Write-Verbose "Now connecting to $computer"
      if ($nameLog){
        $computer | out-file $logFile -Append
      }

      try {
            $continue = $true
            $os = Get-WmiObject -ErrorAction 'Stop' -ComputerName $computer -class Win32_OperatingSystem |
            Select-Object Caption,BuildNumber,OSArchitecture,ServicePackMajorVersion

        } catch {
            Write-Verbose "Connection to $computer failed"
            $continue = $false
            $computer | out-file failedcomp.txt -append
        }

        if ($continue) {
            Write-Verbose "Connection to $computer succeeded"
            $bios = Get-WmiObject -ComputerName $computer -Class Win32_BIOS |
                Select-Object -Property SerialNumber
            $processor = Get-WmiObject -ComputerName $computer -Class Win32_Processor |
                Select-Object -Property AddressWidth -First 1
            $osarchitecture = $os.osarchitecture -replace '-bit',''
            $properties = @{'ComputerName'=$computer;
                            'OSVersion'=$os.Caption;
                            'OSBuild'=$os.BuildNumber;
                            'OSArchitecture'=$osarchitecture;
                            'OSSPVersion'=$os.servicepackmajorversion;
                            'BIOSSerial'=$bios.SerialNumber;
                            'ProcArchitecture'=$processor.addresswidth}
            $obj = New-Object -TypeName PSObject -Property $properties
            Write-Output $obj
            $namesobj += $obj
            }
 
    }
    if ($nameLog) {
      $namesobj | export-csv -Path computerinfo.csv -NoTypeInformation
    }

  }

  End {}


}

Get-DJOSInfo -computername alpha, server01, notonline, server02.testtarget.local -Verbose -nameLog

Open in new window

0
 
Ganesh Kumar ACommented:
You also can use Export-CSV filename.csv to export if you have data you want to get in Excel.
0
 
frankhelkCommented:
I recommend to see i.e.
    https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/out-file 
for the syntax of out-file.

Your command writes an empty string (because no string is given) to the log file and stores the resultcode in $computer.

I think the command should read

out-file -FilePath failedcomp.txt -InputObject $computer

Open in new window


By the way:
Get-WmiObject has a hell of timeout if the queried node is down, which results in an enormous long time to scan a long list with many down nodes. It would be better to first try a single ping on that node prior to query it with Get-WmiObject ... if the ping fails, the Get-WmiObject query would be senseless.
0
 
creative555Author Commented:
thank you! This worked!!!
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now