8

我正在寻找一个可以在cmdlet 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”),但这似乎不起作用。

4

4 回答 4

13

这里有几件事。首先,您不想使用 [boolean] 作为递归参数的类型。这要求您在脚本上为 Recurse 参数传递一个参数,例如-Recurse $true。你想要的是一个 [switch] 参数,如下所示。此外,当您将开关值转发到 Get-ChildItem 上的 -Recurse 参数时,请使用:如下所示的:

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

get-childitem $sourceDirectory -recurse:$recurse -filter $fileTypeFilter | ...
于 2009-12-07T20:31:12.123 回答
4

解决此问题的 PowerShell V1 方法是使用其他答案中描述的方法 (-recurse:$recurse),但在 V2 中,有一种称为splatting的新机制可以更轻松地将参数从一个函数传递到另一个函数。

Splatting 将允许您将字典或参数列表传递给 PowerShell 函数。这是一个简单的例子。

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

在每个函数或脚本内部,您可以使用它$psBoundParameters来获取当前绑定的参数。通过向 中添加或删除项目$psBoundParameters,可以轻松获取当前函数并使用一些函数的参数调用 cmdlet。

我希望这有帮助。

于 2009-12-08T20:03:00.763 回答
2

我之前问过一个类似的问题......我接受的答案基本上是在 PowerShell 的 v1 中,只是通过如下方式传递命名参数:

get-childitem $sourceDirectory -recurse:$recurse -filter ...
于 2009-12-07T20:14:45.733 回答
0

这是您可以使用的参数类型的一个很好的列表:

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

这里

于 2009-12-08T17:03:45.230 回答