# encoding: ascii
# api: powershell
# title: Watch-Expression.ps1
# description: From Windows PowerShell Cookbook (O’Reilly) by Lee Holmes
# version: 0.1
# type: script
# author: Lee Holmes
# license: CC0
# x-poshcode-id: 2127
# x-archived: 2016-05-17T10:56:05
# x-published: 2011-09-09T21:38:00
#
#
#############################################################################
##
## Watch-Expression
##
## From Windows PowerShell Cookbook (O'Reilly)
## by Lee Holmes (http://www.leeholmes.com/guide)
##
##############################################################################
<#
.SYNOPSIS
Updates your prompt to display the values of information you want to track.
.EXAMPLE
PS >Watch-Expression { (Get-History).Count }
Expression Value
---------- -----
(Get-History).Count 3
PS >Watch-Expression { $count }
Expression Value
---------- -----
(Get-History).Count 4
$count
PS >$count = 100
Expression Value
---------- -----
(Get-History).Count 5
$count 100
PS >Watch-Expression -Reset
PS >
#>
param(
## The expression to track
[ScriptBlock] $ScriptBlock,
## Switch to no longer watch an expression
[Switch] $Reset
)
Set-StrictMode -Version Latest
if($Reset)
{
Set-Item function:\prompt ([ScriptBlock]::Create($oldPrompt))
Remove-Item variable:\expressionWatch
Remove-Item variable:\oldPrompt
return
}
## Create the variableWatch variable if it doesn't yet exist
if(-not (Test-Path variable:\expressionWatch))
{
$GLOBAL:expressionWatch = @()
}
## Add the current variable name to the watch list
$GLOBAL:expressionWatch += $scriptBlock
## Update the prompt to display the expression values,
## if needed.
$GLOBAL:oldPrompt = Get-Content function:\prompt
if($oldPrompt -notlike '*$expressionWatch*')
{
$newPrompt = @'
$results = foreach($expression in $expressionWatch)
{
New-Object PSObject -Property @{
Expression = $expression.ToString().Trim();
Value = & $expression
} | Select Expression,Value
}
Write-Host "`n"
Write-Host ($results | Format-Table -Auto | Out-String).Trim()
Write-Host "`n"
'@
$newPrompt += $oldPrompt
Set-Item function:\prompt ([ScriptBlock]::Create($newPrompt))
}