Get-ChildItem recurse в качестве параметра в 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), но это не похоже на работу.

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Отсюда

Другие вопросы по тегам