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.*
将来的には、コードのノイズを減らすために、この構文を簡単に使用する予定です。
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。これは予期しないものであり、シナリオによっては非常に不快な場合があります:)
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]
タイプ。