2016-11-21 5 views
1

だから、私はこのようなタスクに問題持っておくました:別のオブジェクトから展開された文字列のリストの処理を管理するにはどうすればよいですか?

$fileNames = Get-ChildItem -Path . -Filter "*.*" ` 
    | Select-Object -ExpandProperty Name 

$fileNames.GetType() 

をI []は出力が文字列であることを期待したいが、それは[]オブジェクトです。

私は、ファイル名を操作しようとした場合、さらに悪い:

$fileNames = Get-ChildItem -Path . -Filter "*.*" ` 
    | Select-Object -ExpandProperty Name ` 
    | Select-Object { "$_" -replace '^.*deploy\.log\.\d\d\d\d-\d\d-\d\d\.', '' } 

私は、文字列[]再び期待したいです。代わりに、正規表現をキーとして持つ奇妙なハッシュテーブルを取得します。

どちらの場合も、私が期待していることを、オブジェクトにラップするだけです。

ここでのルールは何ですか?私は文字列のリストを操作することはできますか?あなたの最後のパイプラインの要素として

答えて

4

、ご希望の場合は完全にSelect-Object -Expand部分をスキップすることができます代わりにSelect-Object

$fileNames = Get-ChildItem -Path . -Filter "*.*" ` 
    | Select-Object -ExpandProperty Name ` 
    | ForEach-Object { "$_" -replace '^.*deploy\.log\.\d\d\d\d-\d\d-\d\d\.', '' } 

ForEach-Objectを使用します。

$fileNames = Get-ChildItem -Filter *.* | ForEach-Object { 
    $_.Name -replace '^.*deploy\.log\.\d\d\d\d-\d\d-\d\d\.', '' 
} 
+0

をするForEach-Objectには、より多くのマップのようなものです。私。各項目に関数を適用し、リストを返しますか? LinqのForEachのような代わりに、各項目でアクションを取るが、何も返さない? –

+1

'ForEach-Object'は' map'関数と似ています。各繰り返しからのアイテムの返品はオプションです –

5

あなたの最初のコードスニペットの結果は一般的な配列なので(その型はObject[]となります)、要素は実際には文字列です。何らかの理由であなたがするタイプが必要な場合string[]あなたは単にその型に変数をキャストすることができます。しかし、必要ではないはず

[string[]]$filenames = Get-ChildItem ... | Select-Object -Expand Name 

通常を。

2番目のコードスニペットでは、おそらくSelect-ObjectForEach-ObjectMathias' answerを参照)と混同している可能性があります。代わりに、あなたはまた、拡張名に直接-replace演算子を使用することができますForEach-Objectループ使用するのでは:だから

$filenames = (Get-ChildItem ... | Select-Object -Expand Name) -replace '^.*deploy\.log\.\d{4}-\d{2}-\d{2}\.', '' 
+0

ありがとうございます。だから、-replaceはリスト上で動作しますか?それを各アイテムに適用してリストを返しますか? –

+1

それは正しいです。 –