2011-11-16 18 views
187

私は数日前にpowershellの学習を始めました。私は私の質問に耐えるように私が必要なことをするGoogle上で何かを見つけることができませんでした。複数のファイルで文字列を検索してPowershellでファイル名を返す方法は?

テキスト文字列をWindows上で動作するJbossアプリケーションに置き換えるように求められました。私は、可能なターゲットファイルの拡張子を必ずしも知っているわけではなく、その位置も知らない。これまでのところ私は、再帰的にディレクトリ(get-ChildItem -recurse)にアクセスし、私は、get-コンテンツと探していた文字列を検索し、選択文字列をするために管理している:

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

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

私が探している式が含まれているファイルの名前と場所を取得するにはどうすればよいですか?

+0

もっと一般的な質問を編集することがあります。この質問への答えは、JBossやあなたのアプリケーションがあなたに働いていることとは何の関係もありません。 –

答えて

289

これはあなたのパターンが含まれるファイルの場所を与える必要があります:パスが既にあることを

Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name 
+1

これらのファイルを移動したいのであれば、どうしたらいいですか? |参加する|移動 - 項目の最後に移動します。 – rud3y

+5

Move-Itemには 'name'パラメータがありません。 '|を追加してみてください。 %{Move-Item $ _。名前} ' –

+24

' Get-ChildItem -Recurse |選択文字列「ダミー」-List | Select Path'は各ファイルの最初の一致のみを返しますので、ファイルを少し効率的にグループ化する必要はありません – ben

12

パイプあなたが表示されますあなたの

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

からfl *

の内容をオブジェクトのプロパティとして返されます。

あなただけのパスをしたい場合は、重複を削除するselect pathselect -unique pathを使用します。

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path 
+1

両方のおかげで、これはまさに私が探しているものです。残念ながら、パスに関係するサブディレクトリがたくさんある場合、PSは絶対パスを切り捨て、\ dir1 \ dir2 \ dir3 \ path ...のように行の最後に3つのドットを追加します。したがって、どのファイルが返されるかわかりません。 PSに文字の欲張り感を軽減し、完全なパスを表示させる方法がありますか? :) ありがとう! – Bluz

+3

'-File'スイッチを' Get-ChildItem'に追加する必要があります。そうしないと、ディレクトリ上で 'Get-Content'を呼び出そうとするとカスケードエラーが発生します。 – RubberDuck

9
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"} 

これは、完全なファイルの詳細を保つためにあなたのすべてのファイル

+0

最もわかりにくいコマンド –

5

の完全な詳細を提供しますあなたはvikas368(ISEオートコンプリートでうまく動作していなかった)の回答を少し変更することができます:

やショートで:

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

は、ここでは正確な回答のさまざまありますが、ここではいくつかの異なるバリエーションのための最も簡潔なコードです。それぞれのパターンでは、一番上の行は完全な構文を示し、一番下の行は簡潔な構文を示しています。

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

  1. パターンを含むすべてのファイルの

    一覧のFileInfoオブジェクト:

    Get-ChildItem -Recursefilespec| Where-Object { Select-Stringpattern$_ -Quiet } 
    ls -rfilespec| ? { slspattern$_ -q } 
    
  2. パターン含むすべてのファイルの

    一覧ファイル名

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

    Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) } 
    ls -rfilespec| ? { !(slspattern$_ -q) } 
    
  4. 一覧ファイル名のすべてのファイルない含むパターンのための:これは、各ファイルへのフル・パスのリストが表示されます

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

また、どこにでもパターンを含むファイルを探しているだけの場合は、['Select-String'](' https:// ')の '-List'パラメータを使って最初のインスタンスを見つけた後、 /technet.microsoft.com/en-us/library/hh849903.aspx) – KyleMit

+0

私は、OPがこれがAAであるように質問のわずかなバリエーションを求めていたと思います。 #1は非常に便利で、マイケル・ソレンズがPSを怒らせるのは明らかです! – cBlaine

2

検索文字列を含む:

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

結果の上にヘッダーを表示せず、検索文字列を含むテキスト行を表示しないことに注意してください。文字列を含むファイルがどこにあるのかがわかります。

+2

パターンが見つかった行番号とファイル名を表示する方法はありますか? –

5

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

Get-ChildItem -Path d:\applications\*config -recurse | Select-String -Pattern "dummy" 
3

使用すると、1つのディレクトリに検索する場合は、あなたがそれを行うことができます。

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

これは私がそれを行うだろうかで、あなたが得るコンテンツを必要としません:

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

または

ls -r | Select-String dummy | fl 

関係は...

+0

+1、これは私の場合は完璧に動作しますが、より簡潔な出力のために 'select Pattern、LineNumber、Filename'を使用してください。行は、あなたのパターン文字列を含む行にEVERYTHINGを返します。また、必要に応じてこれをcsvに簡単に出力することもできます。 – Protonova

関連する問題