2017-12-14 12 views
1

別のディレクトリに存在するファイル名と一致するように、ログディレクトリ内のテキストファイルの内容を検索しようとしています。Powershellを使用してディレクトリ内のリストからファイル名のログを検索

私はGet-ChildItem $Path -file -nameを実行してリストを返すことができます。私はまた、実行する方法を知っていますGet-Content ... | Select-String -Pattern

しかし、私は-Patternにファイルリストを供給する方法がわかりません。私は成功せず試した何

# Delete all Files in C:\Data\Uploads older than 90 day(s) 
$Path = "C:\the_path" 
$LogPath = "C:\logs" 
Get-Content $LogPath + "\*.log" | Select-String -Pattern (Get-ChildItem $Path -name) 

しかし、私は、これは使用可能なパターンの繰り返しではなくを返しているGet-ChildItemのでちょうど盲目の試みである知っています。

私は何をしようとしているのですか?ファイル名のリストを取得し、それらをログファイルのディレクトリで再帰的に検索しますか?

+0

あなたは 'Get-ChildItem $ Path | Select-Object -ExpandProperty Name'?それはファイル名だけを含む文字列配列を返します。 –

+0

'-SimpleMatch'を' Select-String'に追加するべきでしょう(ファイル名は正規表現ではなくリテラルマッチとして使われます)。あなたが投稿したコードは、あなたが望むことを行うべきであるということ以外は、 –

+2

@Bill_Stewart 'Get-ChildItem'には、' .Name'プロパティの配列を返す '-Name'パラメータがあります。 – TheIncorrigible1

答えて

2

Select-String本質的grepのPowerShellの実装です。それ以外はそれ自身では再発することはできません。それはGet-ChildItemが出場するところです。

Get-ChildItem -Path "$LogPath\*.log" -Recurse | 
    Select-String -Pattern (Get-ChildItem $Path -Name) -SimpleMatch 

あなたは代わりに名前付きパラメータ(ただし、スクリプトでの使用は推奨されません)の文は少しエイリアスを使用して冗長と同様に位置することができます。

ls "$LogPath\*.log" -r | sls (ls $Path -n) -s 

したい場合は、正規表現マッチの代わりに、単純な文字列の一致が-SimpleMatchスイッチを削除します。

+0

再帰でない場合は、最初の 'ls'呼び出しをスキップして' sls -Path C:\ logs \ *。log' – TheIncorrigible1

0

#wishingitwasgrepあなたは近いですが、ここでは動作するはず何か:

@(Get-Content -Path C:\logs\*.log) | 
    Where-Object { $_ -in @(Get-ChildItem -Path C:\the_path -Name) } 

今、あなたはファイルのリストを持っています。


は、どのように私は私がしようとすることだし、それは、 ファイル名のリストを取得し、再帰的にログファイルのディレクトリに彼らのために検索され何ができるのでしょうか?

$List = Get-Content -Path 'C:\LogList.txt' 

$LogList = @(Get-ChildItem -Path 'C:\Logs' -Recurse | 
    Where-Object { $_.Name -in $List }) 

これはあなたのLogList.txtは(例えばMyLog.txtなど)拡張子を持つログファイル名のリストを改行を分離している前提としています。 $LogListにはSystem.IO.FileInfoというオブジェクトの配列があり、これらのファイルを使用して必要な作業を行うことができます。たとえば:

$LogList | Remove-Item 
関連する問題