2009-12-07 17 views
7

Estoy buscando crear una función que pueda alternar la capacidad de recurse en cmdletGet-ChildItem.Get-ChildItem recurse como parámetro en PowerShell

Como un ejemplo muy básico:

... 

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

Get-ChildItem $sourceDirectory -recurse -filter $fileTypeFilter | 

... 

¿Cómo se puede añadir de forma condicional la bandera -recurse a Get-ChildItem sin tener que recurrir a alguna sentencia if/else?

Pensé que quizás uno podría simplemente sustituir el -recurse en la instrucción Get-ChildItem con un parámetro $recurseText (establecido en "-recurse" si $ recurse era verdadero), pero parece que no funciona.

Respuesta

10

Un par de cosas aquí. Primero, no desea usar [boolean] para el tipo del parámetro recurse. Esto requiere que pase un argumento para el parámetro Recurse en su secuencia de comandos, p. -Recurse $true. Lo que quiere es un parámetro [cambiar] como se muestra a continuación. Además, cuando se reenvía el valor interruptor para el parámetro -Recurse en Get-ChildItem utilizar un : como se muestra a continuación:

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

get-childitem $sourceDirectory -recurse:$recurse -filter $fileTypeFilter | ... 
+0

Genial, gracias! ¡Esto parece funcionar! – Sean

+1

Gracias Keith, aprendí algo aquí :) –

2

me hizo una similar question antes ... Mi respuesta aceptada era básicamente que en V1 de PowerShell, simplemente pasando el parámetro denominado como a través de:

get-childitem $sourceDirectory -recurse:$recurse -filter ... 
+0

Desafortunadamente, eso no parece funcionar en v1, parece tratarlo como el siguiente parámetro. get-childitem -recurse $ true Get-ChildItem: No se puede encontrar la ruta 'C: \ src \ True' porque no existe. – Sean

+0

lo siento; usa el: para unir los dos. –

0

He aquí una buena lista de los tipos de parámetros que se pueden utilizar:

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) 
    ) 

de here

3

la forma PowerShell V1 de abordar esto es utilizar el método descrito en las otras respuestas (-recurse: $ recurse), pero en V2 hay un nuevo mecanismo llamado splatting que puede hacer que sea EAS es para pasar los argumentos de una función a otra.

Splatting le permitirá pasar un diccionario o una lista de argumentos a una función de PowerShell. Aquí hay un ejemplo rápido.

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

Dentro de cada función o script puede utilizar $psBoundParameters para obtener los parámetros de ese momento ligado. Al agregar o eliminar elementos al $psBoundParameters, es fácil tomar su función actual y llamar a un cmdlet con algunos de los argumentos de las funciones.

Espero que esto ayude.

Cuestiones relacionadas