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