Выборка файлов (макросы) по контексту с помощью PowerShell

Автор:Izmajlov
Дата:02.11.2010
Просмотров:4942
Скачиваний:2387
Оценка:, Оценок - 1
Сохранить в файле

Обсудить в форуме

Описание

Конкретная задача - выбрать все макросы, в которых остались неизменными пути к серверу. Или другими словами - выбрать файлы с UNC путями в тексте к старым серверам. И сохранить результат поиска в файле.
Из стандартных решений сразу пришло в голову ФАР и скрипт на WSH. Перебор по каталогам, открытие файлов, перебор строк, определение - входит контекст или нет. Стандартно и неинтересно.
У Майкрософта появился новый встроенный в ОС язык - PowerShell. На нем такого рода задачи решаются просто и элегантно.
Вот как выглядит решение данной задачи:
Get-ChildItem "P:\RSBank5.test" -r | where-object {$_.Extension -eq ".mac"} | select-string "\\\\\\\\[^{\\\\\\\\CurrentNameServer}{""\\\\\\\\""}]" | format-Table Path,LineNumber,Line >result.txt

Одной строкой решается с виду простая задача, но..
Разберем, как говорится, по слогам текст команды.
Get-ChildItem "P:\RSBank5.test" -r означает Взять Всех Потомков в каталоге P:\RSBank5.test рекурсивно(-r). Далее следует символ |. Это означает передать результат выполнения предыдущей команды (в виде набора айтемов, т.е. файлов) на вход следующей команды.
where-object {$_.Extension -eq ".mac"} - это фильтр по расширению, здесь все прозрачно
select-string "\\\\\\\\[^{\\\\\\\\CurrentNameServer}{""\\\\\\\\""}]" - здесь посложнее. Текст команды значит - ВыделитьСтроки которые удовлетворяют условию шаблона РегулярногоВыражения, представленного строкой в кавычках. Текст РегулярногоВыражения - положительный результат сравнения даст строка в которой есть вхождение 4-х обратных слэшей, за исключением подстрок - \\\\CurrentNameServer и "\\\\" - это 4 слэша в кавычках.
format-Table Path,LineNumber,Line > result.txt Результат работы Командлета форматировать в виде таблицы с колонками имя файла с полным путем к нему, номер строки в которой положительный результат сравнения, и сама строка и вывести этот поток в файл result.txt

Текст примера

 Get-ChildItem "P:\RSBank5.test" -r | where-object {$_.Extension -eq ".mac"} | select-string "\\\\\\\\[^{\\\\\\\\CurrentNameServer}{""\\\\\\\\""}]" | format-Table Path,LineNumber,Line >result.txt