You are here

PowerShell - сравнение двух текстовых файлов [скрипт]


PowerShell - сравнение двух текстовых файлов [скрипт]

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

Сразу покажу вам скрипт, чтобы не томить.

$f1=get-content -Path .\file1.txt
$f2=get-content -Path .\file2.txt
foreach ($objf1 in $f1)
{
                $objf1 = $objf1.tostring().Trim()
                $objf1 = $objf1.Replace(" ","")
                $objf1 = $objf1.ToUpper()
                $found = $false
                foreach ($objf2 in $f2)
                {
                               $objf2=$objf2.Replace(" ", "")
                               $objf2=$objf2.Trim()
                               $objf2=$objf2.ToUpper()        
                               if ($objf1 -eq $objf2)
                               {                                            
                                               $found = $true                               
                               }                             
                }
                if ((!$found) -and ($objf1 -ne ""))
                {
                               $result += $objf1.tostring().trim() + "`r`n"
                }
}
set-content -path resultFile.txt -value $result
#echo $result

Расскажу предысторию, где этот скриптик мне понадобился. На самом деле всё банально просто. Обнаружилось, что на сервере антивируса, в списке компьютеров, где этот самый антивирус установлен на глаз – меньше компьютеров, чем в домене, при этом согласно политики антивирус должен быть установлен на всех компьютерах в домене.

В конторе, где я сейчас работаю – несколько сотен компьютеров, поэтому вручную сравнивать список компьютеров в консоли антивируса, и в домене – самоубийство. Соответственно, недолго думая было принято решение - взять список из домена, взять список из антивируса сравнить их, и тем самым выполнить задачу.

Если кто не понял, каждая новая строчка в файлах – новый элемент для сравнения.

Разберем работу этого скрипта.

В первых двух строчках мы считываем наши файлы.

$f1=get-content -Path .\file1.txt
$f2=get-content -Path .\file2.txt

Далее запускаем цикл для первого файла, где для каждой строки убираем пробелы, если они есть и переводим все символы в заглавные. Присваиваем переменной, которая будет показывать найден ли элемент значение ложь.

foreach ($objf1 in $f1)
{
$objf1 = $objf1.tostring().Trim()
$objf1 = $objf1.Replace(" ","")
$objf1 = $objf1.ToUpper()
$found = $false
...
}

Внутри первого цикла запускаем еще один, где перебираем элементы из второго файла, так же каждую строчку отчищаем и переводим символы в заглавные и сравниваем каждый элемент из второго файла с текущим элементом из первого. Если элемент найден – присваиваем переменной значение истина.

foreach ($objf2 in $f2)
{
   $objf2=$objf2.Replace(" ", "")
   $objf2=$objf2.Trim()
   $objf2=$objf2.ToUpper()        
   if ($objf1 -eq $objf2)
   {                                            
      $found = $true                               
   }                             
}

После завершения второго цикла, если элемент не был найден, записываем его в строковую итоговою переменную, и повторяем процедуру для следующих элементов из первого файла.

if ((!$found) -and ($objf1 -ne ""))
{
   $result += $objf1.tostring().trim() + "`r`n"
}

В самом конце скрипта записываем нашу переменную с результатами в файл.

set-content -path resultFile.txt -value $result

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

16 0

Share the article with your friends in social networks, maybe it will be useful to them.


If the article helped you, you can >>thank the author<<