# encoding: ascii
# api: powershell
# title: Out-Default URL Launcher
# description: This bad boy is from an email by Bruce Payette—the master. Here are some notes from the email:
# version: 0.1
# type: function
# author: halr9i000
# license: CC0
# x-poshcode-id: 803
# x-archived: 2016-04-19T06:39:07
# x-published: 2009-01-14T09:30:00
#
# “Add the function below to your profile and you should have what you want. By overriding Out-Default,
# this function can do a couple of things. First, it captures the last object written in
# $GLOBAL:LAST. The more germane feature is that it traps any errors that are written. If the error is
# “command not found” and the command takes the form of “http://msdn.microsoft.com” or “live.com” it
# uses [diagnostics.process]::start() to launch the browser (this could just be start-process in V2). Finally,
# if the command name resolves to a directory, it cd’s to that directory.
# This works in both the console host and the ISE but the implementation depends on our host convention – that
# all output and errors are routed through Out-Default, so it may not work in other hosts.” – Bruce Payette
#
# Wrapper for Out-Default that saves the last object written
# and handles missing commands if the command is a directory
# or an URL
#
function Out-Default `
{
[CmdletBinding(ConfirmImpact="Medium")]
param(
[Parameter(ValueFromPipeline=$true)] `
[System.Management.Automation.PSObject] $InputObject
)
begin
{
$wrappedCmdlet = $ExecutionContext.InvokeCommand.GetCmdlet(
"Out-Default")
$sb = { & $wrappedCmdlet @PSBoundParameters }
$__sp = $sb.GetSteppablePipeline()
$__sp.Begin($pscmdlet)
}
process {
$do_process = $true
if ($_ -is [System.Management.Automation.ErrorRecord])
{
if ($_.Exception -is [System.Management.Automation.CommandNotFoundException])
{
$__command = $_.Exception.CommandName
if (test-path -path $__command -pathtype container)
{
set-location $__command
$do_process = $false
}
elseif ($__command -match '^http://|\.(com|org|net|edu)$')
{
if ($matches[0] -ne "http://") { $__command = "HTTP://" + $__command }
[diagnostics.process]::Start($__command)
$do_process = $false
}
}
}
if ($do_process)
{
$global:LAST = $_;
$__sp.Process($_)
}
}
end { $__sp.End() }
}