Привет, сегодня хочу показать очередной простенький скрипт на 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
Вообще, я считаю, что подобный скрипт в хозяйстве всегда пригодится, поэтому надеюсь, что заметка оказалась вам полезной.
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<<