フォルダ内のどの.txtファイルに特定のテキストが含まれているかを識別する実行可能プロセスを作成する

フォルダ内のどの.txtファイルに特定のテキストが含まれているかを識別する実行可能プロセスを作成する

私のオペレーティング システムは Windows 10 です。

1 つまたは複数の .txt ファイルを含むフォルダーがあります。各ファイルには、次のようにフォーマットされた行があります。

2016-12-07 14:08:43 7.7 b=123 r=890

フォルダー内のすべてのファイルを調べ、6.77 日以上前の日付を含むすべてのファイルのファイル名を .txt ファイルに提供する、実行可能な再現可能なプロセスを作成したいと考えています。

シナリオ例:

ファイル1には以下が含まれます:2016-12-07 14:08:43 7.7 b=123 r=890

ファイル2には以下が含まれます:2017-01-24 14:08:43 7.7 b=123 r=890

ファイル3には以下が含まれます:2017-01-23 14:08:43 6.7 b=123 r=890

プロセスを実行すると、次の内容を含む .txt ファイルが受信されます。File3

これをコマンド ラインや PowerShell を使用して実行できるかどうか、またはこのタスクを実行するために完全な開発作業が必要なのかどうかはわかりません。

答え1

次のPowerShellスクリプト

Get-ChildItem *.txt -Recurse |
    ForEach-Object { 
        $aux=$_
        Get-Content "$aux" | 
            ForEach-Object {
                if ($_ -match '6\.7') {
                    if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7)) {
                        $aux.FullName
                    }
                }
            }
    }

または同等のワンライナー

Get-ChildItem *.txt -Recurse | ForEach-Object { $aux=$_; Get-Content "$aux" | ForEach-Object {if ($_ -match '6\.7') {if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7)) {$aux.FullName}}}}

基本的な説明:

  • txtファイルのリストを取得しGet-ChildItem|結果を次のコマンドレットにパイプする
  • (パイプ)特定のファイルごとにForEach-Object
  • 補助変数に保存します$aux=$_;ワンライナーの末尾のセミコロンに注意してください)
  • 内容を1行ずつ取得しGet-Content|結果を次のコマンドレットにパイプします。
  • (パイプ)特定の行ごとにForEach-Object
  • 行に6.7文字列が含まれているかどうかをテストするif ($_ -match '6\.7')
  • そうであれば、日付(最初の19文字)が指定された基準に一致するかどうかをテストします。if ( [datetime] …
  • もしそうなら、ファイル名を公開する $aux.FullName
  • {そして、一連の終了 s を使用してすべての開始 s を閉じます}

答え2

JosefZ の元の回答を拡張すると、次の回答がより完全であることがわかります。

PowerShell ファイル内に以下を含めます。

$filespath = "\\sampledirectory\log\"
$outputfilename = "\\sampledirectory\log\results.txt"

########## file creation step
Get-ChildItem -Path $filespath *.txt -Recurse |
    ForEach-Object { 
        $aux=$_
        Get-Content "$aux" | 
            ForEach-Object {
                if ($_ -match '6\.7')
                {
                    if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7))
                    {
                        $aux.FullName | Out-File $outputfilename -append
                    }
                }
            }
    }

関連情報