创建一个可执行进程,用于识别文件夹中哪些 .txt 文件包含特定文本

创建一个可执行进程,用于识别文件夹中哪些 .txt 文件包含特定文本

我的操作系统是Windows 10。

我有一个包含一到多个 .txt 文件的文件夹。每个文件中的行格式如下:

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

我希望创建一个可执行的可重复过程,它将查看文件夹中的所有文件,并在 .txt 文件中为我提供包含6.7日期超过七天的所有文件的文件名。

示例场景:

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

File2 包含:2017-01-24 14:08:43 7.7 b=123 r=890

File3 包含: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并将|结果传送到下一个 cmdlet
  • (管道)对于每个特定文件ForEach-Object
  • 将其保存到辅助变量$aux=$_(注意;一行中的尾随分号)
  • 并逐行获取其内容Get-Content并将|结果通过管道传输到下一个 cmdlet
  • (管道)对于每一行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
                    }
                }
            }
    }

相关内容