2016-08-19 3 views
0

Ich versuche Get-ChildItem Funktion von benutzerdefinierten Funktion aufrufen. Das Problem ist, dass die Argumente für die Funktion dynamisch sein können.Powershell Aufruf Funktion mit Argument als String

function Test { 
    Get-ChildItem $Args 
} 

Wenn ich versuche,

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 

Wie wrap around function und pass the arguments as it's?

+3

'Get-ChildItem @ Args' – PetSerAl

+0

@PetSerAl Waaay besser als IEX hacken, ich habe vergessen, dass man Arrays vollzuspritzen kann. Sollte eine Antwort sein. – beatcracker

+0

@PetSerAl, können Sie Ihre Antwort posten? Ich glaube, das ist besser als IEX. und IEX unterstützt 'Leerzeichen getrennte Argumente' nicht. Dies unterstützt alles – Reddy

Antwort

3

$args ist ein Array von Argumenten, und die Übergabe an die Get-ChildItem würde nicht funktionieren, wie Sie bemerkt haben. Der PowerShell-Weg dafür wäre der Proxy Command.

Für einen schnellen und unsauberen Hack, können Sie Invoke-Expression:

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

Invoke-Expression schwierig sein wird, mit zu arbeiten, weil, was passierte als Strings alle immer wieder zitieren müssen, wenn sie in einem ausgedrückt Zeichenfolge. ProxyCommand ist der bessere Weg, wie Beatcracker vorgeschlagen hat.

Es gibt ein paar Alternativen für Spaß und Interesse. Sie könnten PSBoundParameters splattern, aber Sie müssen die Parameter deklarieren, die Sie voraussichtlich übergeben werden.

Dies ist ein unvollständiges Beispiel, in dem es sich leicht ärgern wird, wenn doppelte Parameter vorhanden sind (einschließlich allgemeiner Parameter, wenn Sie CmdletBinding für die Funktion Test festlegen).

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 
    } 
} 
Verwandte Themen