私は2、3日前にPowerShellを学び始めました、そして、私が必要とするものをするグーグルで何かを見つけることができませんでしたので、私の質問に耐えてください。
テキスト文字列を複数のファイルに置き換えるように依頼されました。私は必ずしも可能なターゲットファイルの拡張子を知りませんし、それらの場所も知りません。これまで、ディレクトリ(get-ChildItem -recurse
)を再帰的に参照し、get-contentとselect-stringで探していた文字列を見つけました。
Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
問題は、探しているテキストの出現を確認できることですが、一致するすべてのファイルのパスと名前を返すようにPSに指示する方法がわかりません。
探している表現を含むファイルの名前と場所を取得するにはどうすればよいですか。
これはあなたのパターンを含むファイルの場所を与えるはずです:
Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name
ここにはさまざまな正確な答えがありますが、ここにいくつかの異なるバリエーションのための最も簡潔なコードがあります。バリエーションごとに、一番上の行に完全な構文が表示され、一番下の行に簡潔な構文が表示されます。
項目(2)はJon Zとmanojldsからの回答のより簡潔な形式ですが、項目(1)はvikas368とbuygrushからの回答と同等です。
Patternを含むすべてのファイルのリストFileInfoobjects:
Get-ChildItem -Recursefilespec| Where-Object { Select-Stringpattern$_ -Quiet }ls -rfilespec| ? { slspattern$_ -q }
Patternを含むすべてのファイルについて、リストファイル名:
Get-ChildItem -Recursefilespec| Select-Stringpattern| Select-Object -Unique Pathls -rfilespec| slspattern| select -u Path
FileInfoすべてのファイルのオブジェクトnotパターンを含む:
Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) }ls -rfilespec| ? { !(slspattern$_ -q) }
ファイル名すべてのファイルについてnotパターンを含む:
(Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) }).FullName(ls -rfilespec| ? { !(slspattern$_ -q) }).FullName
あなたのコンテンツをパイプする
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
これにより、パス、ファイル名、およびパターンと一致したコンテンツ行が表示されます。
Get-ChildItem -Path d:\applications\*config -recurse | Select-String -Pattern "dummy"
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}
これはあなたにすべてのファイルの完全な詳細を与えるでしょう
これが私のやり方です。get-contentは必要ありません。
ls -r | Select-String dummy | select line,path
または
ls -r | Select-String dummy | fl *
さまざまなプロパティが何であるかを確認するには...
完全なファイルの詳細を結果の配列に保存するには、vikas368によって投稿された回答を少し変更します(これはISEのオートコンプリートではうまく機能しないようです)。
Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" }
または要するに:
ls -r | ?{ $_ | Select-String -Pattern "dummy" }
1つのディレクトリを検索する場合は、それを実行できます。
select-string -Path "c:\temp\*.*" -Pattern "result" -List | select Path
これにより、検索文字列を含む各ファイルへのフルパスのリストが表示されます。
foreach ($file in Get-ChildItem | Select-String -pattern "dummy" | Select-Object -Unique path) {$file.path}
結果の上にヘッダーは表示されず、検索文字列を含むテキスト行は表示されません。それだけで、文字列を含むファイルを見つけることができる場所がわかります。
私はもう少し情報を私に与えるために上記の答えの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"
この構造体を使ってパスとファイルのワイルドカードを指定でき、ファイル名、行番号、および関連する行を出力ファイルに保存します。