2017-07-20 15 views
1

現在、テストソフトウェアを開始し、結果をログファイルにエクスポートするために、時間別のスケジュールでバッチファイルを実行しています。ログファイルは、ファイル拡張子のない一般的なファイルタイプです。拡張子のないファイルからデータを抽出するPowershellスクリプト

現在、3つのpowershell行を手動で実行して、指定した行をログファイルから抽出し、1つの大きなテキストファイルにエクスポートします。まず、ログが保存されているディレクトリに変更します。次に、現在のディレクトリをスクラブしてファイルに追加します.3番目は、選択したテキストをスクラップして、ディレクトリと同じ出力ファイルに追加します。 LINES:ラインについては

  1. cd directorypath
  2. (Get-Item -Path ".\" -Verbose).FullName | Add-Content c:\TestLogs\LogData.txt
  3. Get-Content -Path .\"{0CF215CA-7E09-4280-A792-6184B9366FCA}" | Select-String Last | Add-Content c:\TestLogs\LogData.txt

ディレクトリ・パス1は常に変化します。ログファイルはC:\ TestLogsに格納されます。このディレクトリ内には、次の書式の例のサブフォルダがあります。Log072020170800

3行目のデータは、{0CF215CA-7E09-4280-A792-6184B9366FCA}というファイルに格納されています。このファイル名は常に変更されますが、同じ8-4-4-4-12(GUID)形式になります。このファイル名には拡張子はなく、同じファイル名構造を持つ2つのファイルがディレクトリ内にあります。しかし、私が掻きしたいファイルは通常約60kbのサイズですが、他のファイルは2〜5kbです。

これらの3つのPowerShell行を実行するプロセスを自動化したいと思いますが、最善の方法についてはわかりません。任意の提案をいただければ幸いです。

答えて

0

私はこれがあなたを助けると思う!

レッツは

$CollectedInfo = 'C:\Testlogs\Logdata.txt' 

たちはサブフォルダを検索される場所の定義してみましょう行くには、出力データのための場所を設定します。

$MainLogLocation = 'C:\TestLogs' 

ここで、考えられるフォルダを探す場所を知ったので、物事を絞り込んでみましょう。 LastAccessTimeLastWriteTimeを使用するとよいでしょう。

$Newest = Get-ChildItem -Path $MainLogLocation | Sort-Object LastWriteTime -Descending | Select-Object -First 1 

偉大な、今我々は最新のサブフォルダ/バッチを知っている。その中のファイルがGUIDであると同時に、必要に応じて最大のものを選んでみましょう。

$WorkFile = Get-ChildItem $Newest.FullName | Where-Object {$_.Name -match "^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$"} | Sort-Object Length -Descending | Select-Object -First 1 

ここで、データを取得するフォルダを示す行をログに記録します。

Add-Content -Value $WorkFile.Directory $CollectedInfo 

は最後に、我々はファイルを見て、私たちが望むものは何でも行を検索し、出力ファイル$CollectedInfoに追加します。これは、異なる情報を取得するために数回実行するか、配列とForEachループを使用するように設定することができます。

Get-Content -Path $WorkFile.FullName | Select-String 'STUFF I NEED' | Add-Content $CollectedInfo 
Get-Content -Path $WorkFile.FullName | Select-String 'OTHER STUFF I NEED' | Add-Content $CollectedInfo 
+0

ありがとうございました!これは私がこれを行うために必要な完璧な解決策でした。あなたロック! – MyRedHat

0

これらのファイルが常に中括弧で囲まれていると仮定して、このようなことをする必要があります。そうしないと、あなたは同じGUIDの命名方式でファイルを整理するためにあなたの要件を考えると、あなたは何をベースに判断する必要があります

$directories = get-childitem directorypath 
foreach ($directory in $directories){ 
Get-item -path $directory.fullname | add-content C:\TestLogs\LogData.txt 
get-content -path "{*}" | Select-String Last | Add-Content c:\TestLogs\LogData.txt} 
0

何をしようとしてよりよく一致するパスにワイルドカード検索を変更することができますあなたの並べ替え。理想的には、あなたに確かに教えてくれるファイルの中に何かがあるでしょう。変更された時間のように考えるか、またはユーザーを変更することが効果的かどうかを確認する価値があります。決定要因としておおよそのファイルサイズを指定して以来、私たちはそれを処理することができます。

get-childitem "C:\YourPath" | where { $_.length -gt 10kb -and $_.name -like "{*}" } | Select-String Last | Add-Content c:\YourOutput.txt

私はあなたがこの方法では偽陽性を削減するために逃げることができると思いほど高いという10キロバイトまでtweekでしょう。

あなたはすべてが片方の親の下にあると仮定すると、あなたのログフォルダの最上位レベルでこれを行うことができます: get-childitem "C:\YourPath" -Recurse | where { $_.length -gt 10kb -and $_.name -like "{*}" } | Select-String Last | Add-Content c:\YourOutput.txt

か、あなたのディレクトリに渡し、foreachループの最初のバージョンを包みます。

関連する問題