Nav Pal
Nav Pal

Reputation: 57

Log output of ForEach loop

The code below gets computer info remotely. I couldn't get it send output to a log file. Also, how do I log all unqueried computers in a separate log file?

   Code: 

   $ArrComputers =  gc .\computernames.txt

  Clear-Host
  ForEach ($Computer in $ArrComputers) 
  { 
$computerSystem = get-wmiobject Win32_ComputerSystem -Computer $Computer
$computerBIOS = get-wmiobject Win32_BIOS -Computer $Computer
$Version = Get-WmiObject -Namespace "Root\CIMv2" -Query "Select * from Win32_ComputerSystemProduct" -computer $computer | select version 

 write-host "System Information for: " $computerSystem.Name   -BackgroundColor DarkCyan
    "-------------------------------------------------------"

    "Model: " + $computerSystem.Model
    "Serial Number: " + $computerBIOS.SerialNumber
    "Version: " + $Version

    ""
    "-------------------------------------------------------"

      }

Upvotes: 2

Views: 4289

Answers (2)

Alexander Obersht
Alexander Obersht

Reputation: 3275

Logging is fairly straightforward. You just need to store output in a variable and then use Out-File cmdlet:

$ArrComputers = gc .\computernames.txt
$OutputLog = ".\output.log" # Main log
$NotRespondingLog = ".\notresponding.log" # Logging "unqueried" hosts

$ErrorActionPreference = "Stop" # Or add '-EA Stop' to Get-WmiObject queries
Clear-Host

ForEach ($Computer in $ArrComputers) 
{
    try
    {
        $computerSystem = get-wmiobject Win32_ComputerSystem -Computer $Computer
        $computerBIOS = get-wmiobject Win32_BIOS -Computer $Computer
        $Version = Get-WmiObject -Namespace "Root\CIMv2" `
            -Query "Select * from Win32_ComputerSystemProduct" `
            -computer $computer | select -ExpandProperty version
    }
    catch
    {
        $Computer | Out-File -FilePath $NotRespondingLog -Append -Encoding UTF8
        continue
    }

    $Header = "System Information for: {0}" -f $computerSystem.Name

    # Outputting and logging header.
    write-host $Header -BackgroundColor DarkCyan
    $Header | Out-File -FilePath $OutputLog -Append -Encoding UTF8

    $Output = (@"
-------------------------------------------------------

Model: {0} 
Serial Number: {1} 
Version: {2} 

-------------------------------------------------------

"@) -f $computerSystem.Model, $computerBIOS.SerialNumber, $Version

    # Ouputting and logging WMI data
    Write-Host $Output
    $Output | Out-File -FilePath $OutputLog -Append -Encoding UTF8
}

Upvotes: 1

StegMan
StegMan

Reputation: 531

In its current state, your code will give an error for each computer the Get-WmiObject command could not reach. I would consider using -ErrorAction SilentlyContinue -ErrorVariable Err at the end of the first Get-WmiObject command. This will stop the errors from coming to your screen and clogging your output. You can then condition the other two calls to Get-WmiObject to only happen if the ErrorVariable is empty. If it exists, log the name of the computer, and then output to a file.

The reason you are not able to log anything else to a file is because you are using Write-Host. I would consider using a PSObject to return information. This will allow you to see the output on the screen in an organized fashion while also allowing you to write output to a file.

Also, using the -ExpandProperty switch with Select-Object will keep you from returning a hashtable for the Version property.

Upvotes: 0

Related Questions