Get-ChildItem recurse в качестве параметра в PowerShell - PullRequest
8 голосов
/ 07 декабря 2009

Я хочу создать функцию, которая могла бы переключать возможность повторения в командлет Get-ChildItem .

В качестве очень простого примера:

...

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

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

...

Как условно добавить флаг -recurse в Get-ChildItem, не прибегая к некоторым операторам if / else?

Я подумал, что, возможно, можно было бы просто заменить -recurse в выражении Get-ChildItem параметром $recurseText (установленным в "-recurse", если $ recurse были true), но это, похоже, не работает. *

Ответы [ 4 ]

13 голосов
/ 07 декабря 2009

Несколько вещей здесь. Во-первых, вы не хотите использовать [boolean] для типа параметра recurse. Это требует, чтобы вы передавали аргумент для параметра Recurse в вашем скрипте, например -Recurse $true. Вам нужен параметр [switch], как показано ниже. Кроме того, при пересылке значения переключателя в параметр -Recurse в Get-ChildItem используйте :, как показано ниже:

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

get-childitem $sourceDirectory -recurse:$recurse -filter $fileTypeFilter | ...
4 голосов
/ 08 декабря 2009

Способ PowerShell V1 для этого - использовать метод, описанный в других ответах (-recurse: $ recurse), но в V2 есть новый механизм, называемый splatting , который может облегчить передать аргументы из одной функции в другую.

Splatting позволит вам передавать словарь или список аргументов в функцию PowerShell. Вот быстрый пример.

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

Внутри каждой функции или скрипта вы можете использовать $psBoundParameters, чтобы получить текущие связанные параметры. Добавляя или удаляя элементы в $psBoundParameters, можно легко взять текущую функцию и вызвать командлет с аргументами некоторых функций.

Надеюсь, это поможет.

2 голосов
/ 07 декабря 2009

Я задавал подобный вопрос раньше ... Мой принятый ответ был в основном таковым в v1 PowerShell, просто передавая названный параметр через:

get-childitem $sourceDirectory -recurse:$recurse -filter ...
0 голосов
/ 08 декабря 2009

Вот хороший список типов параметров, которые вы можете использовать:

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

С здесь

...