Akim Sissaoui
Akim Sissaoui

Reputation: 17

Declaring parameters does not work if anything is above param

I have a script with parameters. In order to ease the debug of the script I create a small function I found on the net to list all my variables. In order to do so, I start by getting all existing variables at the top of the script, then I create a function which compares recorded variables before and after getting parameters

Problem is when I put the $AutomaticVariables and the function before param declaration, PowerShell gives me the following error for any parameter where I set a default value. Is there anyway to workaround this … bug? If it's not a bug, why the hell this behavior. I don't see the point.

The assignment expression is not valid. The input to an assignment operator must be an object that is able to accept assignments, such as a variable or a property.

# Array and function to debug script variable content
$AutomaticVariables = Get-Variable

function check_variables {
  Compare-Object (Get-Variable) $AutomaticVariables -Property Name -PassThru |
    Where -Property Name -ne "AutomaticVariables"
}

param(
  [String]$hostname,
  [String]$jobdesc,
  [String]$type = "standard",
  [String]$repo,
  [String]$ocred,
  [String]$site,
  [String]$cred = "SRC-$($site)-adm",
  [String]$sitetype,
  [String]$room,
  [String]$chsite = "chub"
)

# TEST - Display variables
check_variables

Upvotes: 1

Views: 1653

Answers (2)

Mathias R. Jessen
Mathias R. Jessen

Reputation: 174690

As mentioned in the comments, you should gather the variables you want to exclude in the calling scope:

Define function (could as well be a script), notice the $DebugFunc parameter I've added at the end:

function Do-Stuff 
{
    param(
        [String]$hostname,
        [String]$jobdesc,
        [String]$type = "standard",
        [String]$repo,
        [String]$ocred,
        [String]$site,
        [String]$cred = "SRC-$($site)-adm",
        [String]$sitetype,
        [String]$room,
        [String]$chsite = "chub",
        [scriptblock]$DebugFunc
    )

    if($PSBoundParameters.ContainsKey('DebugFunc')){
        . $DebugFunc
    }
}

Now, gather the variables and define your function, then inject it into Do-Stuff:

# Array and function to debug script variable content
$AutomaticVariables = Get-Variable
function check_variables {
    Compare-Object (Get-Variable) $AutomaticVariables -Property Name -PassThru | Where -Property Name -ne "AutomaticVariables"
}

Do-Stuff -DebugFunc $Function:check_variables

Upvotes: 2

Martin Brandl
Martin Brandl

Reputation: 58981

It's not a bug. The param section defines the input parameter of your script thus has to be the first statement (same as with functions). There is no need to perform any action before the param block.

If you explain what you want to achieve with your check_variables (not what it does). We probably can show you how to do it right.

Upvotes: 0

Related Questions