1. ホーム
  2. powershell

[解決済み] Powershell Get-ChildItem -Filter は、同じ値でWhere句とは異なる動作をします。

2022-03-06 17:16:05

質問

サーバーに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\.*" が、これは単に何も返しません。 私は何か単純なことを見逃しているのでしょう。

Powershellバージョン2を動かしています。

解決方法

ワイルドカードのマッチングの違いを指摘してくれたRoman Kuzminに感謝します。 以下は期待通りの出力です。

gci C:\Sample\MyFolder.*

今後、コードのノイズを減らすために、この構文を簡単に使っていこうと思います。

解決方法は?

その Filter は、PowerShell ワイルドカードよりも CMD ワイルドカードを使用します。CMD ワイルドカードは、いくつかのエッジケース(主に歴史的なもの)において、おかしく、直感的ではありません。ここに興味深い説明があります。 https://devblogs.microsoft.com/oldnewthing/20071217-00/?p=24143

もうひとつ、気をつけなければならないことがあります。 ls -Filter *.txt のようなファイルを取得します。 *.txt* PowerShell の意味でのファイル、つまり拡張子が 開始 テキスト . これは、シナリオによっては予期しない、非常に不愉快なことかもしれません :).