2015-11-13 5 views
7

含めるPowerShellの5.0.10586.0PowerShellの5のGet-ChildItemコマンドレットLiteralPathは動作しません今私は、Windows 10 TH2に更新もう

で10586を構築する今、私は、Get-ChildItemコマンドレット

$files = Get-ChildItem -LiteralPath $path -Force -Recurse -Include *.txt 
との問題を抱えて

これは.txtでなくても、$ pathにあるすべてのファイルを返します。 これはアップデート前に動作していました。 私は

$files = Get-ChildItem -Path $path -Force -Recurse -Include *.txt 

にそれを変更すると、それが再び動作します。しかし、それは私が望むものではありません。 これはバグですか?何か間違っていますか?

+1

ここには$パスがありますが、最後に\が付いていますか? –

+0

私は両方をテストしました。最後に\がある場合とない場合があります。違いはありません。 –

答えて

4

個人的には、I never-Includeまたは-Excludeを使用してください。私はいつもWhere-Objectに通しています。 -Include-Excludeの作者が狂っているのか、根底にある.Netプロバイダに問題があるのか​​分かりませんが、地獄のように薄れています。

私は5.0.10240.16384です。

gci -Path $path -Include *.txt -Force 

何も返しません。

gci -LiteralPath $path -Include *.txt -Force 

$pathのすべてを返します。

gci -LiteralPath $path -Include *.txt -Force -Recurse 
gci -Path $path -Include *.txt -Force -Recurse 

どちらも、* .txtは$pathとすべてのサブフォルダに返されます。

だから適切な行動は何でしょうか? -Recurseフラグが-Includeの仕組みを変更していますか?知りません。私はもはや気にしない。私はそのような行動に対処するつもりはない。私はこれを使用する:

gci -Path $path -Recurse -Force | Where-Object { $_.Extension -eq '.txt' } 

私は、ファイルやフォルダを列挙するGet-ChildItemに依存しているとそれはそれをです。私にオブジェクトを与えたら、それらをフィルタリングします。すべての古いRemove-Item -Recurseバグのように、そこには人々がそれを期待する方法ではうまくいかないものがあります。

+0

-Includeは-Recurseでのみ動作します。 –

+0

@MarcFauser Hm、そうです。 [The doc](https://technet.microsoft.com/en-us/library/hh849800。aspx)は、 '-Include'が' -Path'引数を変更し、 '-LiteralPath'引数について何も言わないことを示しています。なぜこのコマンドレットはサポートされていない構文のエラーを出力しませんか?そして、私は '-Recurse'なしで' -Path'と '-Include'を明示的に使用している例3をどうすればいいのか分かりません!私はもう一度、「適切な行動はどうなっているのですか?私はおそらくMicrosoft Connectに投稿しています。 –

+0

@BaconBitsはこの2年を知っている可能性がありますが、答えに訪れる人は、コマンドレットがサポートされていない構文を知らないことがわかります - PSプロバイダサブシステムに渡すだけです - ファイルシステムPSプロバイダのワイルドカード動作はレジストリプロバイダ、ActiveDirectoryプロバイダなどから入手できます。ファイルシステムのワイルドカードはWindows 3またはMS-DOS時代に下位互換性があるため、「地獄のように薄れて」いる理由も考えられます。また、PSProviderの実装に依存しているため、ドキュメントはあまり言い表せませんが、「パスを修飾します」という理由もあります。 – TessellatingHeckler

0

として提出しました。-Filterにはこの問題はないようです。これは動作します(多くのあなたのコードによって追加where句のように、PowerShellの自体によって適用されるIncludeではなく)それが基になるプロバイダーによって使用されているため

$files = Get-ChildItem -LiteralPath $path -Force -Recurse -Filter *.txt 

Filterは、またmore efficientです。

しかし、Filter only accepts one pattern parameter, whereas Include supports multiple patterns

関連する問題