Удалите записи одного текстового файла, присутствующие в другом

#powershell

Вопрос:

У меня есть 2 текстовых файла, как показано ниже

 exclude.txt

10.1.1.3
10.1.1.4
10.1.1.5
10.1.1.6
 
 free.txt
10.1.1.3
10.1.1.4
10.1.1.5
10.1.1.6
10.1.1.7
10.1.1.8
10.1.1.9
10.1.1.10
 

Я хочу написать исключить записи из exclude.txt от free.txt и запишите в другой файл

 10.1.1.7
10.1.1.8
10.1.1.9
10.1.1.10
 

Я пытался :

 compare-object  (get-content $freeips) (get-content $excludeip) -PassThru | format-list | Out-File $finalips
 

Здесь, в окончательном выводе, я всегда получаю первый IP-адрес exclude.txt

 10.1.1.7
10.1.1.8
10.1.1.9
10.1.1.10
10.1.1.3
 

и я попробовал другой способ

 $exclude = Get-Content "C:exclude.txt"

foreach($ip in $exclude)
{
    get-content "C:free.txt" | select-string -pattern $ip -notmatch | Out-File "C:diff.txt"
}
 

Но и в этом случае я получаю записи exclude.txt в окончательном выводе.

Пожалуйста, дайте мне знать, где я здесь ошибаюсь

Ответ №1:

Select-String Решение, вероятно, будет быстрее. Кроме того, для этого не требуется итерация по IP-адресам, так как -Pattern параметры принимают массив строк ( String[] ). Дело в том, что по умолчанию шаблон(ы) подавляет регулярное выражение, в котором точка ( . ) является держателем места для любого символа. Для поиска буквального шаблона вам следует использовать -SimpleMatch переключатель:

 $exclude = Get-Content .exclude.txt
get-content .free.txt |Select-String -pattern $exclude -NotMatch -SimpleMatch
 

Примечание. Пробел в верхней части отображаемого exclude.txt файла указывает на то, что в верхней части файла может быть пустая строка (которая regex соответствует любой строке). Чтобы избавиться от пустых строк, используйте:

 $exclude = Get-Content .exclude.txt |Where-Object { $_ }
 

Ответ №2:

При сравнении $excludeip должен быть объект referenceObject и $freeips следует за ним, как это:

 compare-object (get-content $excludeip) (get-content $freeips) -PassThru | Out-File $finalips
 

Комментарии:

1. Спасибо за ваш ответ, но он по-прежнему добавляет IP-адрес файла исключения в окончательный вывод

2. Извините. При сравнении $excludeip должен быть объектом ссылки, а $freeips занимает второе место. Я отредактирую свой ответ.