web-dev-qa-db-ja.com

複数のファイルで文字列を検索し、Powershellでファイルの名前を返す方法は?

私は2、3日前にPowerShellを学び始めました、そして、私が必要とするものをするグーグルで何かを見つけることができませんでしたので、私の質問に耐えてください。

テキスト文字列を複数のファイルに置き換えるように依頼されました。私は必ずしも可能なターゲットファイルの拡張子を知りませんし、それらの場所も知りません。これまで、ディレクトリ(get-ChildItem -recurse)を再帰的に参照し、get-contentとselect-stringで探していた文字列を見つけました。

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

問題は、探しているテキストの出現を確認できることですが、一致するすべてのファイルのパスと名前を返すようにPSに指示する方法がわかりません。

探している表現を含むファイルの名前と場所を取得するにはどうすればよいですか。

265
Bluz

これはあなたのパターンを含むファイルの場所を与えるはずです:

Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name
406
jon Z

ここにはさまざまな正確な答えがありますが、ここにいくつかの異なるバリエーションのための最も簡潔なコードがあります。バリエーションごとに、一番上の行に完全な構文が表示され、一番下の行に簡潔な構文が表示されます。

項目(2)はJon Zとmanojldsからの回答のより簡潔な形式ですが、項目(1)はvikas368とbuygrushからの回答と同等です。

  1. Patternを含むすべてのファイルのリストFileInfoobjects:

    Get-ChildItem -Recursefilespec| Where-Object { Select-Stringpattern$_ -Quiet }ls -rfilespec| ? { slspattern$_ -q }
  2. Patternを含むすべてのファイルについて、リストファイル名

    Get-ChildItem -Recursefilespec| Select-Stringpattern| Select-Object -Unique Pathls -rfilespec| slspattern| select -u Path
  3. FileInfoすべてのファイルのオブジェクトnotパターンを含む:

    Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) }ls -rfilespec| ? { !(slspattern$_ -q) }
  4. ファイル名すべてのファイルについてnotパターンを含む:

    (Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) }).FullName(ls -rfilespec| ? { !(slspattern$_ -q) }).FullName
67
Michael Sorens

あなたのコンテンツをパイプする

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

fl *

パスがすでにオブジェクトのプロパティとして返されていることがわかります。

パスだけが必要な場合は、select pathまたはselect -unique pathを使用して重複を削除します。

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path
14
manojlds

これにより、パス、ファイル名、およびパターンと一致したコンテンツ行が表示されます。

Get-ChildItem -Path d:\applications\*config -recurse |  Select-String -Pattern "dummy" 
13
user5000502
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}

これはあなたにすべてのファイルの完全な詳細を与えるでしょう

9
vikas368

これが私のやり方です。get-contentは必要ありません。

ls -r | Select-String dummy | select line,path

または

ls -r | Select-String dummy | fl *

さまざまなプロパティが何であるかを確認するには...

7
js2010

完全なファイルの詳細を結果の配列に保存するには、vikas368によって投稿された回答を少し変更します(これはISEのオートコンプリートではうまく機能しないようです)。

Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" }

または要するに:

ls -r | ?{ $_ | Select-String -Pattern "dummy" }
5
buygrush

1つのディレクトリを検索する場合は、それを実行できます。

select-string -Path "c:\temp\*.*" -Pattern "result"  -List | select Path
5
Esperento57

これにより、検索文字列を含む各ファイルへのフルパスのリストが表示されます。

foreach ($file in Get-ChildItem | Select-String -pattern "dummy" | Select-Object -Unique path) {$file.path}

結果の上にヘッダーは表示されず、検索文字列を含むテキスト行は表示されません。それだけで、文字列を含むファイルを見つけることができる場所がわかります。

3
Little Girl

私はもう少し情報を私に与えるために上記の答えの1つを修正しました。これは後で私に二度目の質問を免れた。こんな感じでした。

Get-ChildItem `
        -Path "C:\data\path" -Filter "Example*.dat" -recurse | `
    Select-String -pattern "dummy" | `
    Select-Object -Property Path,LineNumber,Line | `
    Export-CSV "C:\ResultFile.csv"

この構造体を使ってパスとファイルのワイルドカードを指定でき、ファイル名、行番号、および関連する行を出力ファイルに保存します。

1
RenoGreg