Get-ChildItem рекурсия как параметр в PowerShell

Я хочу создать функцию, которая могла бы переключать возможность рекурсии в командлете 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), но это, похоже, не работает.


person Sean    schedule 07.12.2009    source источник


Ответы (4)


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

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

get-childitem $sourceDirectory -recurse:$recurse -filter $fileTypeFilter | ...
person Keith Hill    schedule 07.12.2009

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

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

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

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

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

person Start-Automating    schedule 08.12.2009

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

get-childitem $sourceDirectory -recurse:$recurse -filter ...
person John Weldon    schedule 07.12.2009
comment
К сожалению, похоже, что это не работает в версии 1, кажется, это рассматривается как следующий параметр. get-childitem -recurse $true Get-ChildItem: не удается найти путь «C:\src\True», поскольку он не существует. - person Sean; 07.12.2009
comment
Прости; используйте : чтобы соединить их вместе. - person John Weldon; 07.12.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)
    )

Из здесь

person fenster    schedule 08.12.2009