# encoding: ascii
# api: powershell
# title: Select-Alive
# description: Use as a filter to select computers from a stream on which to act upon later in the pipeline. Example:
# version: 0.1
# license: CC0
# x-poshcode-id: 70
# x-archived: 2008-11-20T11:55:10
#
# get-content servers.txt | select-alive | get-wmiobject win32_foo
# No other output will be given unless you set the -Verbose switch or otherwise have enabled $VerbosePreference.
#
filter Select-Alive {
	param ( [switch]$Verbose )
	trap {
		Write-Verbose "$(get-date -f 's') ping failed: $computer"
		continue
	}
	if ($Verbose) {
		$VerbosePreference = "continue"
		$ErrorActionPreference = "continue"
	}
	else {
		$VerbosePreference = "silentlycontinue"
		$ErrorActionPreference = "silentlycontinue"
	}
	Write-Verbose "$(get-date -f 's') ping start"
	$ping = New-Object System.Net.NetworkInformation.Ping
	$reply = $null
	$_ | foreach-object {
		$obj = $_
		# Accomodate different input object types
		# thx Gaurhoth (http://thepowershellguy.com/blogs/gaurhoth/archive/2007/10/08/an-example-of-how-to-use-new-taskpool.aspx)
		switch ($obj.psbase.gettype().name) {
			"DirectoryEntry"    { $cn = $obj.dnshostname[0] }
			"IPHostEntry"		{ $cn = $obj.HostName }
			"PSCustomObject"    { $cn = $obj.Name }
			"SearchResult"      { $cn = $obj.properties['dnshostname'][0] }
			"String"            { $cn = $obj.trim() }
		}
		Write-Verbose "$(get-date -f 's') pinging $cn..."
		$searchCount++
		$reply = $ping.Send($cn)
		if ($reply.status -eq "Success") {
			$cn; $pingCount++
		}
	}
	Write-Verbose "$(get-date -f 's') ping end - $pingCount/$searchCount online"
}
