从两个文本文件中检索匹配的字符串

时间:2015-09-06 07:54:52

标签: powershell

我有一个文本文件file_paths.txt,其中包含每行的完整路径:

C:\MyFolder1\app1.exe
C:\MyFolder2\l1.dll
C:\MyFolder3\app2.exe
C:\MyFolder1\l2.dll
C:\MyFolder5\app3.exe
C:\MyFolder3\app4.exe
C:\MyFolder6\app5.exe

我还有包含文件夹列表的文件folders.txt

C:\MyFolder1
C:\MyFolder2
C:\MyFolder3
C:\MyFolder4
C:\MyFolder8

我需要遍历folders.txt中的文件夹列表,将其与file_paths.txt中的文件匹配,然后将结果写入文件result.txt,如下所示:

In C:\MyFolder1 more than one files has been found:
    C:\MyFolder1\app1.exe
    C:\MyFolder1\l2.dll

In C:\MyFolder2 one file has been:
    C:\MyFolder2\l1.dll

In C:\MyFolder3 more than one files has been found:
    C:\MyFolder3\app2.exe
    C:\MyFolder3\app4.exe

In C:\MyFolder4 no files has been found.

In C:\MyFolder8 no files has been found.

我的尝试不起作用:

$paths = [System.IO.File]::OpenText("file_paths.txt")
$folders = [System.IO.File]::OpenText("folders.txt")
$result = "result.txt"
try {
    for(;;) {
        $folder = $folders.ReadLine()
        if ($folder -eq $null) { break }
        "In ">> $folder >> ": `n" >> $result
        for(;;) {
           $path = $paths.ReadLine()
           if ($path -eq $null) { break }
           if ($path -contains $folder) {"  ">>$path>>"`n">>$result }
        }
    }
} finally {
    $paths.Close()
    $folders.Close()
}

2 个答案:

答案 0 :(得分:1)

我会将处理与报告分开。首先从folders.txt的内容构建哈希表,然后将file_paths.txt中的行添加到匹配的键中:

$folders = @{}
Get-Content 'folders.txt' | ForEach-Object { $folders[$_] = @() }

Get-Content 'file_paths.txt' | ForEach-Object {
  $line = $_
  $($folders.Keys) | Where-Object {
    $line -like "$_*"
  } | ForEach-Object {
    $folders[$_] += $line
  }
}

然后您可以输出结果数据结构:

$folders.Keys | ForEach-Object {
  'In {0} {1} files have been found' -f $_, $folders[$_].Count
  if ($folders[$_].Count -gt 0) {
    $folders[$_] | ForEach-Object { "`t$_" }
  }
} | Out-File 'result.txt'

答案 1 :(得分:0)

以下是您可以用来完成所需操作的脚本 请注意$folderPath$filePath变量。替换为file_paths.txtfolders.txt文件的绝对或相对(执行脚本的位置)路径。

$folderPath = 'folders.txt'
$filePath = 'file_paths.txt'

(Get-Content $folderPath).Split('`r`n') | ForEach-Object {
    $folder = $_
    $count = 0
    $fileArray = @()
    (Get-Content $filePath).Split('`r`n') | ForEach-Object {
        $file = $_
        if( $file | Select-String $folder -Quiet ) {
            $count++
            $fileArray += $file
        }
    }
    if($count -ne 0) {
        Write-Output "In $folder, $count files has been found."
        $fileArray | ForEach-Object {
            Write-Output "`t$_"
        }
    } else {
        Write-Output "In $folder, no files has been found."
    }
}