param($name, [ScriptBlock] $getter, [ScriptBlock] $setter) Add-Type @" using System; using System.Management.Automation; namespace Lee.Holmes { public class PSScriptVariable : PSVariable { public PSScriptVariable(string name, ScriptBlock scriptGetter, ScriptBlock scriptSetter) : base(name, null, ScopedItemOptions.AllScope) { getter = scriptGetter; setter = scriptSetter; } private ScriptBlock getter; private ScriptBlock setter; public override object Value { get { if(getter != null) { return getter.Invoke(); } else { return null; } } set { if(setter != null) { setter.Invoke(value); } } } } } "@ if(Test-Path variable:\$name) { Remove-Item variable:\$name -Force } $executioncontext.SessionState.PSVariable.Set((New-Object Lee.Holmes.PSScriptVariable $name,$getter,$setter))