Powershell调用函数,参数为字符串

时间:2016-08-19 10:58:11

标签: powershell

我正在尝试从自定义函数调用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 functionpass the arguments as it's

2 个答案:

答案 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
    }
}