2017-07-31 3 views
2

へのパイプラインは、私のプログラムは、このシナリオで作業することを拒否されています何らかの理由でユーザー関数のパラメータの問題

  • 私は私が原因柔軟性
  • の不足のためにコマンドレットを置き換えることを意図しているカスタム関数を持っています

はこれが関数であるパイプラインを通じ 、この関数にファイルやフォルダオブジェクトを渡しています3210

この関数をGet-ChildItemと同じように使用したい場合は、[System.IO.FileSystemInfo]オブジェクトを入力し、すべての子(ここには含まれていないいくつかの追加基準でソートされたもの)を出力として取得します。

これは私が関数を呼び出す方法である:

Get-ChildItem $parentfolder_path | 
    Get-ChildItemCustom | 
    Do-SomethingElse 

エラーを返すが(検証可能型[System.IO.FileSystemInfo]のある)Get-ChildItemの結果を文字列として扱われていることを説明しています。

タイプ "System.String"の "E:¥Data¥VHG-ITC-Test¥New folder¥archive"の値を "System.IO.FileSystemInfo"に変換することはできません。パラメータの前

タイプは常にありませんでした。 $itemが明示的にタイプを持っていなかった場合は、関数は(おそらく唯一の入力としてNameプロパティを取って)入力を読み違えなります

は、Get-ChildItemコマンドレットを:パス「:\ WINDOWS \ SYSTEM32 \新しいフォルダC」を見つけることができませんそれは存在しないからです。

したがって、関数はオブジェクト入力を適切に受け入れることができないようです。私は文字列をすべてのコストで使用することを避け、オブジェクトを動かすだけです。パラメータを間違って設定しましたか?私に何ができる?

答えて

1

問題はあなたの関数では正確ではありませんが、Get-ChildItemは引数を扱います(答えはMoerwaldです)。もし引数を入力として文字列配列を期待するので、オブジェクトが文字列にキャストされた第一の位置パラメータ(-Path)に渡されることが名前を引数としてFileInfoオブジェクトにGet-ChildItemを呼び出す

。しかし、状況によってはFileInfoオブジェクトを文字列にキャストするとFullNameプロパティが展開され、それ以外の場合はNameプロパティだけが展開されることがあります(PowerShellの選択方法については説明できません)。後者は、あなたの場合に起こっていることです。 Get-ChildItemは完全なパスではなく名前だけを表示しているので、現在の作業ディレクトリ内の項目を探しています。これは失敗します。

この問題を回避する方法はいくつかありますが、そのうちの1つはすでにMoerwaldです。その他は以下のとおりです。Get-ChildItem$itemを渡すためのパイプラインを使用して

  • function Get-ChildItemCustom { 
        Param(
         [Parameter(ValueFromPipeline=$true)] 
         [IO.FileSystemInfo]$item, 
    
         [Parameter(ValueFromPipeline=$false)] 
         [string]$archive_path 
        ) 
    
        Process { 
         $item | Get-ChildItem 
        } 
    } 
    
    名前でプロパティをマッピングすることにより、完全なパスを渡す
  • 個人的に
    function Get-ChildItemCustom { 
        Param(
         [Parameter(
          ValueFromPipeline=$true, 
          ValueFromPipelineByPropertyName=$true 
         )] 
         [string[]]$FullName, 
    
         [Parameter(ValueFromPipeline=$false)] 
         [string]$archive_path 
        ) 
    
        Process { 
         Get-ChildItem $FullName 
        } 
    } 
    

、私は最後のバリアント(プロパティ名を渡す)を好むでしょう。

関連する問題