2012-02-13 4 views
2

機能変数を渡すときにPowerShell Where-Objectが動作しないのはなぜですか?

function findf { 
    Write-Host "Find files that match: $args" 
    gci -r | Where-Object { $_.name -match ".*$args.*" } 
} 

が動作するようには思えません。例えば、

findf .exe 

は - EXEファイルへの出力を制限しない原料の束を印刷します -

任意のアイデアを私が間違ってやっていますか?

私はコマンドの機能PowerShellコマンドウィンドウから同じコマンドを実行する場合:正しく

gci -r | Where-Object { $_.name -match ".*.exe.*" } 
この作品

と私示し* .EXEパターン

答えて

4

$argsに一致するファイル表すオブジェクトでありますa コレクションの引数です。

あなたはどちらかのはず

  • 参考$args[0]などの入力パラメータを定義するための最初の引数
  • 使用paramを表す文字列を取得します。

    function findf { 
        param ([string]$SeachStr) 
        Write-Host "Find files that match: $SeachStr" 
        gci -r | Where-Object { $_.name -match ".*$SeachStr.*" } 
    } 
    

    私が例で行ったようにあなたは強くあなたの変数を入力することができますので、私はいつも、param可能な場合を使用して提唱。そうしないと、配列をパラメータとして渡すような混乱を招く可能性があり、これはあらゆる種類の難しい問題を引き起こす可能性があります。

+0

これは機能しました。ありがとうございました。 – PatS

1

$ argsはフィルタブロックがスクリプトブロックであり、それ自身のスコープ内で実行されるため動作しません。すべてのスコープは独自の$ argsで初期化されるため、$ argsを暗黙的に子スコープに渡すことはできません。フィルタスクリプトブロックに引数を渡すための規定がないので、あなたはこのような何かをする必要があります:

function findf { 
     Write-Host "Find files that match: $args" 
     $filter = $args[0] 
     gci -r | Where-Object { $_.name -match ".*$filter.*" } 
    } 

という名前のパラメータを使用して、その子スコープに暗黙的に渡すためにも、動作します。

関連する問題