2015-09-06 6 views
0

У меня есть текстовый файл 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() 
} 

ответ

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' 
0

Ниже приведен скрипт, который вы можете использовать, чтобы сделать именно то, что вам нужно.
Обратите внимание на переменные $folderPath и $filePath. Замените путь абсолютным или относительным (где вы выполняете скрипт) файлы file_paths.txt и folders.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." 
    } 
} 
+0

'Get-Content' уже разбивает файл на список строк (если не используется с параметром '-Raw'). Не нужно использовать '' Split (''r'n')' 'здесь. –