Uri London
Uri London

Reputation: 10797

Use value of parameter in inner (global) function

In PowerShell, I'm trying to customise the prompt inside a function that creates a development shell. I do that by creating an inner function prompt, with global scropt.

function Enter-DevEnvironment {
    Param(
        [Parameter()] [ValidateSet('Debug', 'Release')] $flavor = 'Debug'
    )

    function global:prompt {
        "[$flavor] $($executionContext.SessionState.Path.CurrentLocation)>"
    }
}

The problem is that while the function Enter-DevEnvironment has a variable $flavor, this variable is not available for the prompt function.

I've workedaround this by creating a yet another global variable ($global:DevFlavor = $flavor), and using DevFlavor inside prompt, but it left me wonder, whether a cleaner solution is available. I.E. creating an inner function using values from the outer scope by value, and not refering to a variable that may or may not be defined.

Upvotes: 1

Views: 121

Answers (1)

zett42
zett42

Reputation: 27776

This can be done without creating a global variable, by defining the prompt function using New-Item. This allows us to pass a ScriptBlock and use its method GetNewClosure() to bake the value of the -flavor parameter into the function.

function Enter-DevEnvironment {
    Param(
        [Parameter()] [ValidateSet('Debug', 'Release')] $flavor = 'Debug'
    )
         
    $null = New-Item Function:\global:prompt -Force -Value {        
        "[$flavor] $($executionContext.SessionState.Path.CurrentLocation)>"
    }.GetNewClosure()
}

Upvotes: 3

Related Questions