Powershell - проблема с петлями - PullRequest
3 голосов
/ 16 февраля 2012

Сначала я хотел бы создать список каталогов для всех текстовых файлов в каталоге. Затем возьмите каждый из этих текстовых файлов и получите содержимое. Затем я хочу просмотреть содержимое и найти все текстовые файлы в другом каталоге, которые делятся содержимым с первым файлом, и вывести соответствующие соответствия в файл, названный в честь исходного файла.

Я очень новичок во всем этом и понимаю, что мне не хватает некоторых серьезных фундаментальных кусков знания. Мой небольшой опыт написания сценариев в Javascript, который не кажется полностью переносимым. (Хотя программирование - это программирование, мне сказали.)

Это то, что я имею до сих пор:

$max = get-content h:test1\one.txt | Measure-Object
$A = get-content h:test1\one.txt
For($i=0; $i -lt $max.count ; $i++){
    select-string h:test2\*.txt -pattern $($A[$i]) | Format-Table | Out-File ($i + '.txt')
    }

Я надеюсь на что-то вроде:

$max = get-content $files[i] | Measure-Object
    $A = get-content files[i]
    For($j=0; $j -lt $max.count ; $j++){
        select-string h:test2\*.txt -pattern $($A[$j]) | Format-Table | Out-File($files[i].basename + $j + '.txt')
    }

Любая помощь будет чрезвычайно признательна,

Куртис

Итак

Книга 1 (one.txt)

Столица Франции - Париж.
Население Парижа составляет двенадцать.

Книга 2 (two.txt)

Франция - прекрасная страна.
Столица Франции - Париж.

Мне нужен отчет о том, что two.txt разделяет строку с one.txt.

Ответы [ 2 ]

5 голосов
/ 16 февраля 2012

Сначала я хотел бы создать список каталогов для всех текстовых файлов в каталоге

Вот как:

$textFiles1 = dir -Path C:\Books1 -Filter *.txt
$textFiles2 = dir -Path C:\Books2 -Filter *.txt
  1. Далеевозьмите каждый из этих текстовых файлов и получите их содержимое.
  2. Я хочу посмотреть, есть ли какие-либо строки из первой книги в других книгах.

Воталгоритм для этого (не проверено) (проверено):

foreach ($textFile in $textFiles1) {
    $lines = get-content -Path $textFile
    foreach ($line in $lines) {
        foreach ($textFile2 in $textFiles2) {
            $lines2 = get-content -Path $textFile2 
            if ($lines2 -contains $line) {
                $matchMessage = 'Line: "{0}" is duplicated in "{1}".' -f $line, $textFile2
                $matchMessage | out-file C:\report.txt -encoding UTF8 -Append
            }
        }
    } 
}

notepad C:\report.txt
2 голосов
/ 17 февраля 2012

ОК, давайте разберемся с этим:

Сначала я хотел бы создать список каталогов для всех текстовых файлов в каталоге.Затем возьмите каждый из этих текстовых файлов и получите содержимое.

dir *.txt | get-content

Затем я хочу просмотреть содержимое и найти все текстовые файлы в другом каталоге, которые обмениваются содержимым с первым.file

OK, теперь мы передаем весь этот текст в select-string (сначала отфильтровываем всю пустую строку с помощью ?{$_}:

dir *.txt | get-content | ?{$_} | %{select-string -path searchPath\*.txt -pattern "$_" -simple}

и выводим соответствующиесоответствует файлу, названному в честь исходного файла.

Так что теперь это становится сложнее, потому что мы должны вернуться и отследить имя нашего исходного файла, мы делаем это, заключая наш запрос в foreach (то есть %{}):

dir *.txt | %{ $sourceFile = $_; get-content $_ | ?{$_} | %{select-string -path searchPath\*.txt -pattern "$_" -simple} | out-file "$sourceFile.results" }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...