以下を使用して、$pattern
を含むフォルダー内のすべてのファイルを再帰的にリストします。
Get-ChildItem $targetDir -recurse | Select-String -pattern "$pattern" | group path | select name
しかし、その名前とcontentに$pattern
が含まれているファイルの両方をリストしているようです。上記の$pattern="SAMPLE"
を実行すると、
C:\tmp\config.include
C:\tmp\README.md
C:\tmp\specs\SAMPLE.data.nuspec
C:\tmp\specs\SAMPLE.Connection.nuspec
今:
C:\tmp\config.include
C:\tmp\README.md
実際にはSAMPLEキーワード/テキストが含まれていますが、私は気にしません。パターンに一致するコンテンツを持つファイルではなく、ファイル名をリストするコマンドが必要なだけです。私は何が欠けていますか?
以下の回答に基づいて、私も試しました:
$targetDir="C:\tmp\"
Get-ChildItem $targetDir -recurse | where {$_.name -like "SAMPLE"} | group path | select name
そして:
$targetDir="C:\tmp\"
Get-ChildItem $targetDir -recurse | where {$_.name -like "SAMPLE"} | select name
ただし、結果は返されません。
TocomplementMattの役立つ答え :
具体的には、Select-String
にパイプしているのは[System.IO.FileInfo]
オブジェクトであるため-これはGet-ChildItem
が出力するもの-ではなくstrings、それはこれらのオブジェクトによって表されるファイルのcontentsです検索中です。
各ファイルのパスのfile name部分のみを一致させる必要があり、パターンをwildcard expressionとして表現できると仮定すると、 Select-String
が必要で、代わりにGet-ChildItem
を-Filter
とともに使用できます。これは、Mattの答えのように、またはより低速ですが、少し強力な-Include
です。
警告:
Select-String -Pattern
は、正規表現を受け入れます(例:.*sample.*
; Get-Help about_Regular_Expressions
を参照)、
Get-ChildItem -Filter/-Include
はワイルドカード式を受け入れます(例、*sample*
; Get-Help about_Wildcards
を参照)-それらは異なるものです。
補足説明:filesのみに一致させる場合は、Get-ChildItem
にファイルへの出力を制限するように指示できます(directories )-File
を使用します(同様に、-Directory
で出力をディレクトリに制限できます)。
Group-Object path
(group path
)は、.Path
によって出力される一致情報オブジェクトのSelect-String
プロパティに完全なファイル名が含まれているため、意図したとおりに機能しないため、各ファイルを独自のグループに入れます-基本的に、ノーオペレーション。
Get-ChildItem
だけを使用する場合、同等のプロパティ名は.FullName
になりますが、探しているのはparentパス(含まれるディレクトリのパス)、.DirectoryName
)でグループ化することです。したがって、 :
... | Group-Object DirectoryName | Select-Object Name
これは、一致するファイル名を持つ少なくとも1つのファイルを含む各directoryの完全パスを出力します。
(Select-Object Name
のName
は、.Name
によって返されるgroupオブジェクトのGroup-Object
プロパティを参照します。この場合は、.DirectoryName
プロパティの値です入力オブジェクト上。)
get-ChildItem $targetDir -recurse | where {$_.name -like $pattern} | select name
私は@Itchydonによる答えを試しました
しかし、 '-like' $ patternの使用を追跡できませんでした。
ファイル名に32文字(文字と数字)を含むファイルをリストしようとしていました。
PS C:> Get-ChildItem C:\Users\ -Recurse | where {$_.name -match "[a-zA-Z0-9]{32}"} | select name
または
PS C:> Get-ChildItem C:\Users\010M\Documents\WindowsPowerShell -Recurse | Where-Object {$_.name -match "[A-Z0-9]{32}"} | select name
したがって、この場合、whereを使用するか、where-objectを使用するかは問題ではありません。
Select-stringを直接使用して、特定の文字列に一致するファイルを検索できます。はい、これはfilename:count:content ...などを返しますが、内部的にはこれらの名前は選択または省略できますが、必要なのは出力から「FileName」を選択して「select-object」にパイプするための「filename」。
したがって、「Subject:Webservices restarted」というパターンを持つすべての* .MSGファイルを選択するには、次の操作を実行できます。
Select-String -Path。*。MSG -Pattern 'Subject:WebServices Restarted' -List |オブジェクト選択ファイル名
また、これらのファイルをその場で削除するには、次のようにRMコマンドを使用してForEachステートメントを調べます。
Select-String -Path。*。MSG -Pattern 'Subject:WebServices Restarted' -List | select-objectファイル名| foreach {rm $ _。FileName}
私はこれを自分で試しましたが、100%動作します。
これが役立つことを願っています