Auto-Logging Command Output

In the previous tip we introduced the PreCommandLookupAction supported by PowerShell 3 and better. Today we have a special implementation for you.

When you run below code, PowerShell will accept any command that starts with “*” and log the command output in a text file. The text file opens after the command is done.

So you can now run *dir instead of dir to log the results, or *Get-Process instead of Get-Process.

$ExecutionContext.SessionState.InvokeCommand.PreCommandLookupAction = {
    # is called whenever a command is ready to execute
    param($command, $eventArgs)

    # check commands that start with "*" and were not
    # executed internally by PowerShell
    if ($command.StartsWith('*') -and $eventArgs.CommandOrigin -eq 'Runspace')
    {
        # save command output here
        $debugPath = "$env:temp\debugOutput.txt"
        # clear text file if it exists
        $exists = Test-Path $debugPath
        if ($exists) { Remove-Item -Path $debugPath }
        # remove leading "*" from a command name
        $command = $command.Substring(1)
        # tell PowerShell what to do instead of
        # running the original command
        $eventArgs.CommandScriptBlock = {
          # run the original command without "*", and
          # submit original arguments if there have been any
          $( 
          if ($args.Count -eq 0)
          { & $command }
          else
          { & $command $args }
          ) | 
          # log output to file
          Tee-Object -FilePath $debugPath | 
          # open the file once all output has been processed 
          ForEach-Object -Process { $_ } -End {
           if (Test-Path $debugPath) { notepad $debugPath } 
           }
        }.GetNewClosure()
    }
}

Twitter This Tip! ReTweet this Tip!