views:

291

answers:

4

I am relatively new to PowerShell, so I am hoping this is simple, and I just missed it. I am looking to create a function that could toggle the ability to recurse in get-childItem.

As a very basic example:

...

param 
(   
    [string] $sourceDirectory = ".",
    [string] $fileTypeFilter = "*.log",
    [boolean] $recurse = $true
)

get-childitem $sourceDirectory -recurse -filter $fileTypeFilter | 

...

How does one conditionally add the -recurse flag to get-childItem without having to resort to some if/else statement? I thought perhaps one could just substitute the -recurse in the get-childitem statement with a $recurseText parameter (set to "-recurse" if $recurse were true), but that does not seem to work.

+2  A: 

I asked a similar question before...

My accepted answer was basically that in v1 of powershell, just passing the named parameter through like:

get-childitem $sourceDirectory -recurse:$recurse -filter ...
John Weldon
Unfortunately, that does not seem to work in v1, it seems to treat it as the next parameter.get-childitem -recurse $trueGet-ChildItem : Cannot find path 'C:\src\True' because it does not exist.
Sean
sorry; use the : to join the two together.
John Weldon
+2  A: 

A couple of things here. First, you don't want to use [boolean] for the type of the recurse parameter. That requires that you pass an argument for the Recurse parameter on your script e.g. -Recurse $true. What you want is a [switch] parameter as shown below. Also, when you forward the switch value to the -Recurse parameter on Get-ChildItem use a : as shown below:

param (
    [string] $sourceDirectory = ".",
    [string] $fileTypeFilter = "*.log",
    [switch] $recurse
)

get-childitem $sourceDirectory -recurse:$recurse -filter $fileTypeFilter | ...
Keith Hill
Great, thanks! This seems to work!
Sean
Thanks Keith, I learned something here :)
John Weldon
A: 

Here's a good list of the types of parameters you can use:

param(
    [string] $optionalparam1, #an optional parameter with no default value
    [string] $optionalparam2 = "default", #an optional parameter with a default value
    [string] $requiredparam = $(throw ""requiredparam required."), #throw exception if no value provided
    [string] $user = $(Read-Host -prompt "User"), #prompt user for value if none provided
    [switch] $switchparam; #an optional "switch parameter" (ie, a flag)
    )

From here

fenster
+1  A: 

The PowerShell V1 way to approach this is to use the method described in the other answers (-recruse:$recurse), but in V2 there is a new mechanism called Splatting that can make it easier to pass the arguments from one function to another.

Splatting will allow you to pass a dictionary or list of arguments to a PowerShell function. Here's a quick example.

$Parameters = @{
    Path=$home
    Recurse=$true
}
Get-ChildItem @Parameters

Inside of each function or script you can use $psBoundParameters to get the currently bound parameters. By adding or removing items to $psBoundParameters, it's easy to take your current function and call a cmdlet with some the functions' arguments.

Hope this helps

Start-Automating