Here's something that bedeviled me for the longest time: if I have a [switch] type parameter at the script level, how do I pass it to the core function it calls?

# script Test-It.ps1 will call Test-It function

param (
     [String[]]$ComputerName = @(),
     [switch]$Full    
);

function Test-It {
     param (
         [String[]]$ComputerName = $script:ComputerName
         [switch]$Full
     );
    
     $ComputerName | % { 
         if ($Full) {
             $_;
         } else {
             $_ -replace "\..*";
         }
     }
}

Test-It -ComputerName $ComputerName # how to handle $Full?

I could branch based on $Full to two different calls to Test-It.

if ($Full) {
    Test-It -ComputerName $ComputerName -Full;
} else {
     Test-It -ComputerName $ComputerName;
}

That works, but what if I have three [switch] parameters, such as from the Get-ConsoleBuffer function a few days back?  I'd have to have a binary tree of if () ... else () three deep with eight separate versions of calls to Test-It.

Actually, Get-ConsoleBuffer uses my solution:

# script Test-It.ps1 will call Test-It function

param (
      [String[]]$ComputerName = @(),
      [switch]$Full    
);

function Test-It {
      param (
          [String[]]$ComputerName = $script:ComputerName
          [switch]$Full,
         [bool]$__boolFull
      );
     
     if (!$Full) { $Full = $__boolFull; }
     
      $ComputerName | % { 
          if ($Full) {
              $_;
          } else {
              $_ -replace "\..*";
          }
      }
}

Test-It -ComputerName $ComputerName -__boolFull $Full;

I use an [bool] parameter, _boolFull, to accept the value of $Full specified in the outer script.  It has an 'ugly' name to remind me that it's the [bool] equivalent of the the user-friendly [switch] parameter.  As a matter of personal style I use variable names starting with double-underscore as 'system' variables, i.e.: variables that aren't intended for end-user use.

(For those into computer culture/trivia, this is a variation of Hungarian Notation.)

This means that, for any number of [switch] parameters, I only need to make one version of the call to the nested function.

a