2016-08-19 11 views
0

Get-ChildItem関数をカスタム関数から呼び出そうとしています。問題は、関数の引数が動的になることです。引数を文字列として使用してPowerShellを呼び出す関数

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を試してみてください?

+3

は、 'は、Get-ChildItemコマンドレット@ Args' – PetSerAl

+0

@PetSerAl Waaay IEXがハックよりも良い、私は1つの配列をスプラットできることを忘れてました。答えでなければならない。 – beatcracker

+0

@PetSerAl、回答を投稿できますか?私はこれがIEXより優れていると信じています。 IEXは 'space separated arguments 'をサポートしていません。これはすべてをサポートします – Reddy

答えて

3

$argsは、引数の配列です。あなたが気づいたように、Get-ChildItemに渡すことはできません。このためのPowerShellの方法はProxy Commandです。間に合わせとハックのために

、あなたがInvoke-Expressionを使用することができますが:で発現された場合どのような文字列として渡されていますがもう一度引用が必要になりますので

function Test { 
    Invoke-Expression "Get-ChildItem $Args" 
} 
1

起動-発現はで動作するように困難になります文字列。ビートクラッカーが提案したように、ProxyCommandがより良い方法です。

楽しさと興味のためのいくつかの選択肢があります。 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 
    } 
} 
関連する問題