item - powershell get_content




Get-ChildItemコマンドレットの-Includeパラメーターと混同してください (4)

-filterパラメータを試してください(1つの拡張子しかサポートされていません)。

dir - フィルタ* .txt

ドキュメントから:

-含める

指定した項目だけを取得します。 このパラメーターの値は、Pathパラメーターを修飾します。 "* .txt"などのパス要素またはパターンを入力します。 ワイルドカードは許可されています。

Includeパラメーターが有効になるのは、コマンドにRecurseパラメーターが含まれているか、パスにC:\ Windows *などのディレクトリの内容が含まれている場合のみです。ワイルドカード文字はC:\ Windowsディレクトリの内容を示します。

私の最初の理解は次のとおりです。

c:\test\a.txt
c:\test\b.txt

それで、 'a.txt'と 'b.txt'を得るために、私は書くことができます:

gci -Path "c:\test\*" -Include "*.txt"

そしてこれはうまくいきます。 しかし今、そのような階層を考えてみましょう:

c:\test\a.txt
c:\test\b.txt
c:\test\c.txt\c.txt

同じコマンドが戻ります:a.txt、b.txt、c.txt

実際のロジックは次のようになります。

-Pathで指定されたすべてのエンティティと一致させるために使用します。 一致した要素がファイルの場合 - それを返します。 一致した要素がフォルダの場合は、中を見て、一致する第1レベルの子を返します。

また、ドキュメントは言う:

Includeパラメーターが有効になるのは、コマンドにRecurseパラメーターが含まれている場合、またはパスがディレクトリの内容につながる場合のみです。

これもまた間違っています。 例えば

gci -Path "c:\test" -Include "*.txt"

-Iが含まれていない間は、フォルダの内容を取得します。 だから - 含むことは間違いなく "効果的"です。 ここで本当に何が起こりますか? -Pathは "c:\ test"を指定し、-Includeはこのパスと一致しようとします。 "* .txt"は "test"と一致しないため、何も返されません。 しかし、これを見てください:

gci -Path "c:\test" -Include "*t"

"* t"が "test"にマッチし、すべての子アイテムにマッチしたものとして、a.txt、b.txt、およびc.txtを返します。

結局、現在Includeがどのように機能するのかを知っていても、いつ使うのかわかりません。 サブフォルダの内側を見る必要があるのはなぜですか? それはなぜそれほど複雑なのでしょうか。


Get-ChildItemでパターンマッチングを行うためにJaredParの答え頼りに 、一般的なシェルワイルドカードを使用できます。

例えば:

get-childitem "c:\test\t?st.txt"

どこ "?" 任意の1文字に一致するワイルドカード

get-childitem "c:\test\*.txt"

これは ".txt"で終わる任意のファイル名と一致します。

これにより、探していた「より単純な」動作になります。


あなたは-includeの使用を混同しています。 -includeフラグはパスの内容ではなくパスに適用されます。 再帰フラグを使用しないと、問題となる唯一のパスは、指定したパスです。 これが、最後の例であるc:\testというパスがパス内にあるため、 "*t"と一致する理由です。

次のことを試すことでこれを確認できます。

gci -path "c:\test" -in *e*

これはまだディレクトリ内のすべての子を生成しますが、それはそれらの名前のどれとも一致しません。

recurseパラメータで-includeがより効果的である理由は、階層内のすべてのパスに対してワイルドカードを適用することになるからです。


パスの最後に\*を含めると問題を回避できます。

PS C:\logfiles> Get-ChildItem .\* -include *.log

現在の作業ディレクトリ( C:\logfiles )から.logファイルが返されます。

上記のAlexの例は、foo.logという名前のディレクトリも返されることを示しています。 私が試したとき、そうではありませんでしたが、それは6年後のもので、それはPSの更新によるものかもしれません。

ただし、子項目Modeを使用してディレクトリを除外することができます。

PS C:\logfiles> Get-Childitem .\* -include *.log | where-object {$_.mode -notmatch "d"}

これは 'directory'モードが設定されているものをすべて除外するはずです。





get-childitem