18

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.*

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

4

2 に答える 2

22

of FileSystemプロバイダーはFilter、PowerShellワイルドカードではなくCMDワイルドカードを使用します。CMDワイルドカードは面白く、一部のエッジケースでは、ほとんどの場合歴史的に直感的ではありません。ここに興味深い説明があります:https ://devblogs.microsoft.com/oldnewthing/20071217-00/?p = 24143

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

于 2012-10-16T12:24:13.837 に答える
10
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]タイプ間です。

于 2012-10-16T12:06:48.070 に答える