title: Logging actual error when script fails
body: <p>I have a script here that reads a list of computers and changes the administrator password. When the script is ran, it'll have a log file that says whether the task succeeded or fail. But I also want to log the actual error to the log when it fails. How do I accomplish this?</p>
  
  <pre><code>[cmdletbinding()]
  param (
  [parameter(mandatory = $true)]
  $InputFile,
  $OutputDirectory
  )
  
  if(!$outputdirectory) {
      $outputdirectory = (Get-Item $InputFile).directoryname
  }   
  $failedcomputers    =   Join-Path $outputdirectory "output.txt"
  $stream = [System.IO.StreamWriter] $failedcomputers
  $stream.writeline("ComputerName `t IsOnline `t PasswordChangeStatus")
  $stream.writeline("____________ `t ________ `t ____________________")
  
  $password = Read-Host "Enter the password" -AsSecureString
  $confirmpassword = Read-Host "Confirm the password" -AsSecureString
  
  $pwd1_text = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
  $pwd2_text = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($confirmpassword))
  
  if($pwd1_text -ne $pwd2_text) {
      Write-Error "Entered passwords are not same. Script is exiting"
      exit
  }
  
  if(!(Test-Path $InputFile)) {
      Write-Error "File ($InputFile) not found. Script is exiting"
      exit
  }
  
  $Computers = Get-Content -Path $InputFile
  
  foreach ($Computer in $Computers) {
      $Computer   =   $Computer.toupper()
      $Isonline   =   "OFFLINE"
      $Status     =   "SUCCESS"
      Write-Verbose "Working on $Computer"
      if((Test-Connection -ComputerName $Computer -count 1 -ErrorAction 0)) {
          $Isonline = "ONLINE"
          Write-Verbose "`t$Computer is Online"
      } else { Write-Verbose "`t$Computer is OFFLINE" }
  
      try {
          $account = [ADSI]("WinNT://$Computer/username,user")
          $account.psbase.invoke("setpassword",$pwd1_text)
          Write-Verbose "`tPassword Change completed successfully"
      }
      catch {
          $status = "FAILED"
          Write-Verbose "`tFailed to Change the administrator password. Error: $_"
      }
  
      $obj = New-Object -TypeName PSObject -Property @{
          ComputerName = $Computer
          IsOnline = $Isonline
          PasswordChangeStatus = $Status
      }
  
      $obj | Select ComputerName, IsOnline, PasswordChangeStatus
  
      if($Status -eq "FAILED" -or $Isonline -eq "OFFLINE") {
          $stream.writeline("$Computer `t $isonline `t $status")
      }
  
  }
  $stream.close()
  Write-Host "`n`nFailed computers list is saved to $failedcomputers"
  </code></pre>