我正在尝试从自定义函数调用Get-ChildItem
函数。问题是函数的参数可以是动态的。
function Test {
Get-ChildItem $Args
}
当我尝试
时Test .\ //this works as Path is taken as default argument value
Test .\ -Force //this doesn't work as expected as it still tries to consider entire thing as Path
Test -Path .\ -Force //same error
如何wrap around function
和pass the arguments as it's
?
答案 0 :(得分:3)
$args
是一个参数数组,并且将它传递给Get-ChildItem
将无效,正如您所注意到的那样。 PowerShell的方式是Proxy Command。
对于快速而肮脏的黑客攻击,您可以使用Invoke-Expression
:
function Test {
Invoke-Expression "Get-ChildItem $Args"
}
答案 1 :(得分:1)
Invoke-Expression将难以使用,因为当以字符串表示时,作为字符串传递的内容需要再次引用。 ProxyCommand是beatcracker建议的更好的方式。
有一些乐趣和兴趣的选择。您可以展开PSBoundParameters,但是您需要声明您希望传递的参数。
这是一个不完整的例子,如果存在重复参数(如果在函数Test上设置CmdletBinding,则包括常用参数),很容易让人感到沮丧。
function Test {
dynamicparam {
$dynamicParams = New-Object Management.Automation.RuntimeDefinedParameterDictionary
foreach ($parameter in (Get-Command Microsoft.PowerShell.Management\Get-ChildItem).Parameters.Values) {
$runtimeParameter = New-Object System.Management.Automation.RuntimeDefinedParameter(
$parameter.Name,
$parameter.ParameterType,
$parameter.Attribtes
)
$dynamicParams.Add($parameter.Name, $runtimeParameter)
}
return $dynamicParams
}
end {
Get-ChildItem @psboundparameters
}
}