Для поиска файлов через Powershell есть командлет ChildItem. С помощью него мы можем фильтровать данные. Например так мы выведем все файлы и папки, которые лежат на диске C.
Поиск по содержимому файлов через Powershell
Мы можем искать внутри файлов, т.е. вхождение строк:
- SimpleMatch — строка, которую мы хотим найти внутри файла
В случае выше, для всего что слева от pipeline | , будет идти поиск внутри файлов на упоминание строки fixmypc.
Командлет Select-String может использоваться для поиска файлов:
Разница в том, что он будет искать только в текущей папке, а не во вложенных. Он так же будет искать вхождение в каждом файле, что при большом объеме существенно увеличит время работы. Т.е. эта команда предназначена уже для отфильтрованных значений, например после Get-ChildItem.
Но в Select-String есть дополнительные ключи, которые могут быть полезны. Вот часть из них:
- CaseSensitive — в обычных командлетах и сравнениях Powershell "а" и "А" одинаковые буквы. Если поставить этот ключ, то они станут разными
- Pattern — если с ключом SimpleMatch мы можем найти конкретную строку (нельзя использовать * звездочку), то с этим ключом мы можем использовать регулярные выражения.
Иногда есть необходимость найти файл, по содержащимся в нем словам, или же найти все строки содержащие нужный паттерн. Рассмотрим несколько вариантов поиска по тексту в Powershell
Для примера я буду искать в логах Exchange 2013 нужного мне отправителя
Использовать командлет Select-String можно разными способами. Например подавать содержимое файлов через конвейер:
Как видно это весьма медленный вариант.
Указывая список файлов аргументом Select-String мы получим значительный прирост скорости поиска.
Workflow
Я попробовал несколько вариантов использования Select-String в Workflow. Сначала вариант с циклом:
- switch в Windows PowerShell …
- Основы PowerShell: определение конца …
- Что такое Windows PowerShell и с чем …
- Проблемы с использованием регулярного …
На удивление, никакого прироста скорости поиска я не получил, даже увеличивая значение «-throttlelimit»
Самым быстрый вариант
Здесь в блоке parallel мы, используя InlineScript, заносим результат Select-String в массив
Не могу объяснить за счет чего именно достигается увеличение скорости поиска, тем не менее, при необходимости найти документ или строки в большом объеме данных, можно использовать эту конструкцию. Можно искать по всем дискам компьютера, или же и вовсе по списку компьютеров. Думаю в этом случае мы получим прирост по времени, значительно больший чем 3 секунды
Я знаю, что этот вопрос может быть "вопросом нового парня", но я, вероятно, допустил логическую ошибку.
У меня есть текстовый файл, и я хочу искать, содержит ли он строку или нет. Я попробовал это, как показано ниже, но это не работает:
я думаю, это то, что вы пытаетесь сделать:
В вашем примере вы определяете строку с именем $SEL , а затем проверяете, равна ли она $null (что, конечно, всегда будет иметь значение false , поскольку определяемая вами строка не является $null ! )
Кроме того, если файл содержит шаблон, он вернет что-то вроде:
Поэтому не забудьте переключить свои -eq на -ne или поменять местами свои команды if/else , потому что в настоящее время вы повторяете Contains String , когда $SEL равен $null , то есть назад.
Проверьте SS64 для объяснений и полезных примеров для всего в PowerShell и cmd
Другой способ проверить, существует ли строка в файле:
но это не дает вам указание на то, где в файле существует текст. Этот метод также работает по-другому, так как вы сначала получаете содержимое файла с помощью Get-Content , поэтому это может быть полезно, если вам нужно выполнить другие операции с этим содержимым после проверки существования строки.
0.0 00
Справка по команде grep
Шаблон выбора и его интерпретация: -E, —extended-regexp ШАБЛОН — расширенное регулярное выражение -F, —fixed-regexp ШАБЛОН — строки, разделённые символом новой строки -G, —basic-regexp ШАБЛОН — простое регулярное выражение (по умолчанию) -P, —perl-regexp ШАБЛОН — регулярное выражения языка Perl -e, —regexp=ШАБЛОН использовать ШАБЛОН для поиска -f, —file=ФАЙЛ брать ШАБЛОН из ФАЙЛа -i, —ignore-case игнорировать различие регистра -w, —word-regexp ШАБЛОН должен подходить ко всем словам -x, —line-regexp ШАБЛОН должен подходить ко всей строке -z, —null-data строки разделяются байтом с нулевым значением, а не символом конца строки Разное: -s, —no-messages не показывать сообщения об ошибках -v, —invert-match выбирать не подходящие строки -V, —version показать информацию о версии и закончить работу —help показать эту справку и закончить работу Управление выводом: -m, —max-count=ЧИСЛО остановиться после указанного ЧИСЛА выбранных строк -b, —byte-offset печатать вместе с выходными строками смещение в байтах -n, —line-number печатать номер строки вместе с выходными строками —line-buffered сбрасывать буфер после каждой строки -H, —with-filename печатать имя файла для каждой выводимой строки -h, —no-filename не начинать вывод с имени файла —label=МЕТКА использовать МЕТКУ в качестве имени файла для стандартного ввода -o, —only-matching показывать только часть строки, совпадающей с ШАБЛОНОМ -q, —quiet, —silent подавлять весь обычный вывод —binary-files=ТИП считать, что двоичный файл имеет ТИП: «binary», «text» или «without-match». -a, —text то же что и —binary-files=text -I то же, что и —binary-files=without-match -d, —directories=ДЕЙСТВ как обрабатывать каталоги ДЕЙСТВИЕ может быть «read» (читать), «recurse» (рекурсивно) или «skip» (пропускать). -D, —devices=ДЕЙСТВ как обрабатывать устройства, FIFO и сокеты ДЕЙСТВИЕ может быть «read» или «skip» -r, —recursive то же, что и —directories=recurse -R, —dereference-recursive тоже, но с переходом по всем символьным ссылкам —include=Ф_ШАБЛОН обработать только файлы, подпадающие под Ф_ШАБЛОН —exclude=Ф_ШАБЛОН пропустить файлы и каталоги, подпадающие под Ф_ШАБЛОН —exclude-from=ФАЙЛ пропустить файлы, подпадающие под шаблон файлов из ФАЙЛА —exclude-dir=ШАБЛОН каталоги, подпадающие под ШАБЛОН, будут пропущены -L, —files-without-match печатать только имена ФАЙЛОВ без выбранных строк -l, —files-with-matches печатать только имена ФАЙЛОВ с выбранными строками -c, —count печатать только количество выбранных строк на ФАЙЛ -T, —initial-tab выравнивать табуляцией (если нужно) -Z, —null печатать байт 0 после имени ФАЙЛА Управление контекстом: -B, —before-context=ЧИС печатать ЧИСЛО строк предшествующего контекста -A, —after-context=ЧИС печатать ЧИСЛО строк последующего контекста -C, —context[=ЧИС] печатать ЧИСЛО строк контекста -ЧИСЛО то же, что и —context=ЧИСЛО —color[=КОГДА], —colour[=КОГДА] использовать маркеры для различия совпадающих строк; КОГДА может быть «always» (всегда), «never» (никогда) или «auto» (автоматически) -U, —binary не удалять символы CR в конце строки (MSDOS/Windows) Если в качестве ФАЙЛА указан символ «-», то читается стандартный ввод. Если ФАЙЛ не указан и задан параметр командной строки -r, то читается текущий каталог «.» и «-» в противном случае. Если указано менее двух ФАЙЛОВ, то предполагается -h. При нахождении совпадений любой строки, кодом завершения программы будет 0, и 1, если ничего не совпало. При возникновении ошибок и если не указан параметр -q, кодом завершения будет 2.
Разбиение текста
Pattern
-
Метод String[] split(CharSequence text, int limit) разбивает text в соответствии с найденными соответствиями шаблону объекта Pattern и возвращает результаты в массиве. Каждый элемент массива задает текстовую последовательность, отделенную от следующей последовательности соответствующим шаблону фрагментом текста (или концом текста). Элементы массива находятся в том же порядке, в котором они встречаются в text.
В этом методе, количество элементов массива зависит от параметра limit, контролирующего также и число искомых соответствий.
- При положительном значении выполняется поиск не более чем limit-1 соответствий, а длина массива не превышает limit элементов.
- При отрицательном значении выполняется поиск всех возможных соответствий, и длина массива может быть произвольной.
- При равном нулю значении выполняется поиск всех возможных соответствий, длина массива может быть произвольной, а пустые строки в конце отбрасываются.
- Метод String[] split(CharSequence text) вызывает предыдущий метод с 0 в качестве аргумента limit и возвращает результат его вызова.
split(CharSequence text)
- Это только мне кажется, или у …
- PowerShell — Wikiwand
- Lebedev Yuriy — Windows PowerShell и …
- PowerShell и другие скрипты
Pattern p = («,\\s»); String[] fields = («John Doe, 47, Hillsboro Road, 32000»); for (int i = 0; i < ; i++) (fields[i]);
John Doe 47 Hillsboro Road 32000
Где использовать регулярные выражения
SEO-специалисты прибегают к регулярным выражениям при работе с Google Analytics, , RewriteRule в .htaccess, в текстовых редакторах, при работе с краулерами (Netpeak Spider).
Расскажу о нескольких регулярных выражених, которые часто мне помогают.
1. Выделить всё, кроме домена:

.*://|/.*
Использую, когда есть большой список URL-адресов (например, внешних ссылок) и для анализа нужно вычленить только домен. В NotePad++ с помощью функции замены меняю на пустую строку и получаю чистый список доменов:
2. Выделить URL заданной вложенности:
.*://*?/.*?/.*?/
Здесь конструкция (/.*?/) обозначает один уровень вложенности.

Использую это выражение, когда нужно задать максимально разрешенную вложенность URL при сканировании сайта в Netpeak Spider.
Чтобы просканировать все URL адреса только первого уровня вложенности, в сервисе нужно задать такие настройки:
Замена подстрок по регулярному выражению
Наиболее частый кейс такой замены — замена на пустоту, когда наша задача попросту удалить из текста определенные символы. Наиболее популярны:
- удаление цифр из текста
- удаление пунктуации
- всех символов, кроме букв и цифр

Но бывают случаи, когда необходима реальная замена — например, когда нужно заменить буквы с хвостиками/умляутами/ударениями и прочими символами из европейских алфавитов на их английские аналоги. Задача популярна среди SEO-специалистов, формирующих урлы сайтов этих стран на основе оригинальной семантики. Так выглядит начало таблицы паттернов для замены диакритических символов на латиницу с помощью RegEx при генерации URL:
Диакритические символы и их английские эквиваленты
Разбить ячейку по буквам
Чтобы разбить ячейку посимвольно, достаточно извлечь все символы через разделитель. Выражением для извлечения будет обычная точка, она как раз и обозначает любой символ

Разбить буквы и цифры в ячейке
Если строго соблюдать постановку этой задачи, ее выполнить довольно сложно. Но зато с помощью регулярных выражений можно отделить цифровые последовательности символов от нецифровых. Так будет выглядеть выражение:
([^\d.]+|[\d.]+)
А так будет выглядеть процесс на практике:

Разбиваем текст на цифры и нецифровые символы (буквы и знаки препинания) с помощью регулярного выражения
Вставить текст после первого слова
При замене по регулярному выражению в !SEMTools есть опция замены не всех, а только первого найденного фрагмента, удовлетворяющего паттерну. Это позволяет решить задачу вставки символов после первого слова. Просто заменим первый пробел на нужные нам символы с помощью соответствующей процедуры:
Эту задачу можно решить также с помощью функции ПОДСТАВИТЬ, но можно и воспользоваться функционалом замены по регулярному выражению. В отличие от обычной процедуры замены, здесь можно заменить только первое вхождение. В данном случае — первый пробел. Как видно, пробел ничем не отличается от обычного:

Заменяем первый пробел с помощью замены по регулярному выражению
Вставить символ после каждого слова или перед ним
Надстройка решает эту задачу в 2 клика готовой процедурой в меню «Изменить слова«, но можно воспользоваться и несложным выражением для замены:
($| ) (^| )

Выражения обозначают, что заменяются пробелы или конец строки в первом случае и пробелы или начало строк во втором. Вертикальная черта — то самое «ИЛИ».
А заменять будем, соответственно, на пробел с символом слева или справа. Процедура добавит лишний пробел перед ячейкой или после, поэтому от него желательно будет избавиться — «удалить лишние пробелы» или «Удалить символы в начале / конце ячейки«.
Вставка символа после каждого слова с помощью регулярного выражения
Инициализация многомерного массива
$array = @(1, 2, 3), @(4, 5, 6), @(7, 8, 9) $array[] # 1 $array[][] # 1 $array[2][2] # 9 Что ещё
Дополнения к вышеописанным объектам существуют ещё объекты ArrayList, OrderedDictionary, PSObject, которые могут быть полезны вам для хранения и обработки значений. Возможно в дальнейшем я опишу их в отдельной статье. И расскажу про отличия от массивов и хеш-таблиц. Но пока я этого не сделал, то настоятельно рекомендую Вам самостоятельно поискать в Интернет информацию о PSObject. Это мощное средство, которое в чём-то похоже на Hashtable, при этом обладает большей производительностью.