web-dev-qa-db-ja.com

Powershell Get-ChildItem -Filterは、同じ値のWhere句とは動作が異なります

MyFolderというサーバー上にフォルダーがあります。 MyFolder.1、MyFolder.2、MyFolder.3などと呼ばれる追加のフォルダーがあります。

私が実行した場合:

gci C:\Sample | ? { $_.Name -like "MyFolder.*" }

期待どおりの出力が得られます。

    Directory: C:\Sample


Mode                LastWriteTime     Length Name                                                                      
----                -------------     ------ ----                                                                      
d----        16/10/2012     12:16            MyFolder.1                                                                
d----        16/10/2012     12:16            MyFolder.2                                                                
d----        16/10/2012     12:16            MyFolder.3  

しかし、私が実行した場合:

gci C:\Sample -Filter "MyFolder.*"

私は得る:

    Directory: C:\Sample


Mode                LastWriteTime     Length Name                                                                      
----                -------------     ------ ----                                                                      
d----        16/10/2012     12:16            MyFolder                                                                  
d----        16/10/2012     12:16            MyFolder.1                                                                
d----        16/10/2012     12:16            MyFolder.2                                                                
d----        16/10/2012     12:16            MyFolder.3                                                                

MyFolderが出力にどのように含まれるかについて混乱しています。出力は同じだと思います。

オンラインヘルプ は、フィルターの構文がプロバイダーに基づいていることを強調していますが、このインスタンスで使用されているプロバイダーがわかりません。

ここで基本的な知識が不足していますか?正規表現文字列をフィルターに渡そうとしました。例:"MyFolder\.*"しかし、これは単に何も返しません。簡単なものが欠けていると思います。

Powershellバージョン2を実行しています。

解決

ワイルドカードマッチングの違いを指摘してくれたRomanKuzminに感謝します。以下に期待される出力を示します。

gci C:\Sample\MyFolder.*

将来的には、コードのノイズを減らすために、この構文を簡単に使用する予定です。

13
Kieranties

FileSystemプロバイダーのFilterは、PowerShellワイルドカードではなくCMDワイルドカードを使用します。 CMDワイルドカードは面白く、一部のEdgeケースでは、ほとんどが歴史的に直感的ではありません。ここに興味深い説明があります: http://blogs.msdn.com/b/oldnewthing/archive/2007/12/17/6785519.aspx

覚えておくべきもう1つの落とし穴:ls -Filter *.txtは、実際にはPowerShellの意味で*.txt*のようなファイル、つまり拡張子startingのファイルを取得します。 withtxt。これは予期しないものであり、シナリオによっては非常に不快な場合があります:)

14
Roman Kuzmin
gci C:\Sample -Filter "MyFolder.*"  # here is a filesystem provider; use wildcard `*`,`?`

(cmd.exeシェルで)と同じ出力を返します:

dir Myfolder.* 

正規表現が必要な場合は、これが方法です(-filter正規表現を受け入れません)

gci C:\Sample | ? { $_.Name -match '^MyFolder\..*' }

ここみたいに

gci C:\Sample | ? { $_.Name -like "MyFolder.*" }

スクリプトブロックでの比較は[string]タイプ。

6
CB.