我希望创建一个可以在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为true则设置为“-recurse”),但这似乎不是工作
答案 0 :(得分:13)
这里有几件事。首先,您不希望将[boolean]用于recurse参数的类型。这要求您在脚本上传递Recurse参数的参数,例如-Recurse $true
。你想要的是[switch]参数,如下所示。此外,当您将开关值转发到Get-ChildItem上的-Recurse参数时,请使用:
,如下所示:
param (
[string] $sourceDirectory = ".",
[string] $fileTypeFilter = "*.log",
[switch] $recurse
)
get-childitem $sourceDirectory -recurse:$recurse -filter $fileTypeFilter | ...
答案 1 :(得分:4)
PowerShell V1的方法是使用其他答案中描述的方法(-recurse:$ recurse),但是在V2中有一个名为splatting的新机制,可以更容易地通过从一个函数到另一个函数的参数。
Splatting允许您将字典或参数列表传递给PowerShell函数。这是一个简单的例子。
$Parameters = @{
Path=$home
Recurse=$true
}
Get-ChildItem @Parameters
在每个函数或脚本中,您可以使用$psBoundParameters
来获取当前绑定的参数。通过向$psBoundParameters
添加或删除项目,可以轻松获取当前函数并使用某些函数参数调用cmdlet。
我希望这会有所帮助。
答案 2 :(得分:2)
之前我问similar question ...我接受的答案基本上是在PowerShell的v1中,只需将命名参数传递给:
get-childitem $sourceDirectory -recurse:$recurse -filter ...
答案 3 :(得分: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)
)
来自here