Поиск в файле в powershell: GREP в PowerShell: Поиск текста в файле с Select-String

Содержание

Поиск файлов через Powershell | FixMyPC



Для поиска файлов через Powershell есть командлет ChildItem. С помощью него мы можем фильтровать данные. Например так мы выведем все файлы и папки, которые лежат на диске C.



Get-ChildItem -Path "C:\" -Recurse


Где:


  • Path — где искать. Если его не указать, то powershell будет искать там файлы, откуда он и запущен. Через запятую можно указать несколько директорий.
  • Recurse — рекурсивный поиск. Когда этот ключ не установлен, показываются файлы только текущей папки. Когда этот установлен, показываются, в том числе, папки и файлы внутри других папок.


Если у нас ожидаются папки, к которым у нас нет доступа, то мы можем добавить ключ -ErrorAction, что бы процесс поиска не останавливался с ошибкой:



Get-ChildItem -Path "C:\Windows\" -Recurse -ErrorAction SilentlyContinue


Для поиска нужных элементов у нас есть два ключа: для включения параметра и исключения. Например я знаю точно, что у программы «Калькулятор» файл имеет в названии calc, а расширение exe. При этом не уверен находится ли он в папке Windows или Program Files и включу оба пути. Так же я хочу исключить файлы с расширением msi и словом win:



Get-ChildItem -Path C:\Windows\,C:\Program Files\ -Include "*calc*.exe" -Exclude "*.msi","win*" -Recurse -Force -ErrorAction SilentlyContinue


Где:


  • Include нужен для поиска вхождения. Знак * говорит, что я не знаю с чего начинается имя файла, но в нем есть calc, я не знаю что идет после, но заканчивается на .exe . Например под эти результаты подходят 1111calc1111.exe или AbcAlc2.exe.
  • Exclude говорит, что мне не нужно, т.е. исключит из выдачи. Это файлы заканчивающиеся на .msi и начинающиеся на win.
  • Force этот ключ позволяет искать в скрытых файлах и папках

Если мы используем Include и не используем Recurse, то знак * обязателен в Path иначе результат будет пустой.


 




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



$date = Get-Date -Year 2019 -Month 6 -Day 22 -Hour 1 -Minute 00


Не обязательно все заполнять, но в таком случае значения будут приняты по умолчанию (от текущего дня).



Затем передадим эти значения в наш поиск:



Get-ChildItem -Path "C:\" -Include "*.txt" -Exclude "*.rar" -Recurse | Where-Object {$_.LastWriteTime -ge $date}


Где:


  • | это конвейер или Pipline, он говорит о том, что к каждому объекту слева нужно применить действия справа
  • Where-Object {$_.LastWriteTime — говорит о том, что нужно применять только к тем объектам, где есть значение LastWriteTime (последнее время изменения).
  • -ge $date — значит, что объект должен быть больше или равен (Greater than or equal) нашей переменной с датой. Если бы мы хотели узнать до определенной даты, мы должны были бы указать -le $date, -eq если бы дата была бы ровна. Называется «Операторы сравнения»

 




Мы можем искать внутри файлов, т.е. вхождение строк:



Get-ChildItem -Path C:\Folder1\ -Include "*.txt" -Recurse | Select-String -SimpleMatch "fixmypc"


Где:


  • SimpleMatch — строка, которую мы хотим найти внутри файла

В случае выше, для всего что слева от pipeline | , будет идти поиск внутри файлов на упоминание строки fixmypc.


Командлет Select-String может использоваться для поиска файлов:



Select-String -Path C:\Folder1\* -SimpleMatch "fixmypc" -Include "*.txt" -Exclude "*.rar"


Разница в том, что он будет искать только в текущей папке, а не во вложенных. Он так же будет искать вхождение в каждом файле, что при большом объеме существенно увеличит время работы. Т.е. эта команда предназначена уже для отфильтрованных значений, например после Get-ChildItem.


Но в Select-String есть дополнительные ключи, которые могут быть полезны. Вот часть из них:


  • CaseSensitive — в обычных командлетах и сравнениях Powershell «а» и «А» одинаковые буквы. Если поставить этот ключ, то они станут разными
  • Pattern — если с ключом SimpleMatch мы можем найти конкретную строку (нельзя использовать * звездочку), то с этим ключом мы можем использовать регулярные выражения.

Рекомендую

Подписывайтесь на наш Telegram канал

Теги:

#powershell

Select-String (Microsoft.PowerShell.Utility) — PowerShell | Microsoft Learn

  • Ссылка
Модуль:
Microsoft.PowerShell.Utility

Выполняет поиск текста в строках и файлах.

Синтаксис

Select-String
      [-Culture <String>]
      [-Pattern] <String[]>
      [-Path] <String[]>
      [-SimpleMatch]
      [-CaseSensitive]
      [-Quiet]
      [-List]
      [-NoEmphasis]
      [-Include <String[]>]
      [-Exclude <String[]>]
      [-NotMatch]
      [-AllMatches]
      [-Encoding <Encoding>]
      [-Context <Int32[]>]
      [<CommonParameters>]
Select-String
      [-Culture <String>]
      -InputObject <PSObject>
      [-Pattern] <String[]>
      -Raw
      [-SimpleMatch]
      [-CaseSensitive]
      [-List]
      [-NoEmphasis]
      [-Include <String[]>]
      [-Exclude <String[]>]
      [-NotMatch]
      [-AllMatches]
      [-Encoding <Encoding>]
      [-Context <Int32[]>]
      [<CommonParameters>]
Select-String
      [-Culture <String>]
      -InputObject <PSObject>
      [-Pattern] <String[]>
      [-SimpleMatch]
      [-CaseSensitive]
      [-Quiet]
      [-List]
      [-NoEmphasis]
      [-Include <String[]>]
      [-Exclude <String[]>]
      [-NotMatch]
      [-AllMatches]
      [-Encoding <Encoding>]
      [-Context <Int32[]>]
      [<CommonParameters>]
Select-String
      [-Culture <String>]
      [-Pattern] <String[]>
      [-Path] <String[]>
      -Raw
      [-SimpleMatch]
      [-CaseSensitive]
      [-List]
      [-NoEmphasis]
      [-Include <String[]>]
      [-Exclude <String[]>]
      [-NotMatch]
      [-AllMatches]
      [-Encoding <Encoding>]
      [-Context <Int32[]>]
      [<CommonParameters>]
Select-String
      [-Culture <String>]
      [-Pattern] <String[]>
      -LiteralPath <String[]>
      -Raw
      [-SimpleMatch]
      [-CaseSensitive]
      [-List]
      [-NoEmphasis]
      [-Include <String[]>]
      [-Exclude <String[]>]
      [-NotMatch]
      [-AllMatches]
      [-Encoding <Encoding>]
      [-Context <Int32[]>]
      [<CommonParameters>]
Select-String
      [-Culture <String>]
      [-Pattern] <String[]>
      -LiteralPath <String[]>
      [-SimpleMatch]
      [-CaseSensitive]
      [-Quiet]
      [-List]
      [-NoEmphasis]
      [-Include <String[]>]
      [-Exclude <String[]>]
      [-NotMatch]
      [-AllMatches]
      [-Encoding <Encoding>]
      [-Context <Int32[]>]
      [<CommonParameters>]

Описание

Командлет Select-String использует сопоставление регулярных выражений для поиска текстовых шаблонов во входных строках и файлах. Вы можете использовать Select-String аналогичные в grep UNIX или findstr.exe Windows.

Select-String основан на строках текста. По умолчанию Select-String находит первое совпадение в каждой строке и отображает имя файла, номер строки и весь текст в строке, содержащей совпадение. Вы можете напрямую Select-String найти несколько совпадений в строке, отобразить текст до и после совпадения или отобразить логическое значение (True или False), указывающее, найдено ли совпадение.

Select-String может отображать все текстовые совпадения или останавливаться после первого совпадения в каждом входном файле.
Select-String может использоваться для отображения всего текста, который не соответствует указанному шаблону.

Можно также указать, что Select-String следует ожидать определенную кодировку символов, например при поиске в файлах текста Юникода. Select-String использует метку порядка байтов (BOM) для определения формата кодирования файла. Если файл не содержит метки меток, предполагается, что кодировка имеет кодировку UTF8.

Примеры

Пример 1. Поиск соответствия с учетом регистра

В этом примере выполняется сопоставление текста с учетом регистра, отправленного по конвейеру командлету Select-String .

'Hello', 'HELLO' | Select-String -Pattern 'HELLO' -CaseSensitive -SimpleMatch

Текстовые строки Hello и HELLO отправляются по конвейеру в Select-String командлет .
Select-String использует параметр Pattern , чтобы указать HELLO. Параметр CaseSensitive указывает, что регистр должен соответствовать только шаблону верхнего регистра. SimpleMatch является необязательным параметром и указывает, что строка в шаблоне не интерпретируется как регулярное выражение.
Select-String отображает hello в консоли PowerShell.

Пример 2. Поиск совпадений в текстовых файлах

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

Get-Alias | Out-File -FilePath .\Alias.txt
Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\*.txt -Pattern 'Get-'
Alias.txt:8:Alias            cat -> Get-Content
Alias.txt:28:Alias           dir -> Get-ChildItem
Alias.txt:43:Alias           gal -> Get-Alias
Command.txt:966:Cmdlet       Get-Acl
Command.txt:967:Cmdlet       Get-Alias

В этом примере Get-Alias и Get-Command используются с командлетом Out-File для создания двух текстовых файлов в текущем каталоге ,Alias.txt и Command.txt.

Select-String использует параметр Path с подстановочным знаком звездочки (*) для поиска во всех файлах в текущем каталоге с расширением .txtимени файла . Параметр Pattern указывает текст, соответствующий Get-. Select-String отображает выходные данные в консоли PowerShell. Имя файла и номер строки предшествуют каждой строке содержимого, содержащей совпадение для параметра Pattern .

Пример 3. Поиск соответствия шаблону

В этом примере выполняется поиск в нескольких файлах для поиска совпадений для указанного шаблона. В шаблоне используется квантификатор регулярного выражения. Дополнительные сведения см. в разделе about_Regular_Expressions.

Select-String -Path "$PSHOME\en-US\*.txt" -Pattern '\?'
C:\Program Files\PowerShell\6\en-US\default.help.txt:27:    beginning at https://go.microsoft.com/fwlink/?LinkID=108518.
C:\Program Files\PowerShell\6\en-US\default.help.txt:50:    or go to: https://go.microsoft.com/fwlink/?LinkID=210614

Командлет Select-String использует два параметра: Path и Pattern. Параметр Path использует переменную $PSHOME , указывающую каталог PowerShell. Оставшаяся часть пути включает в себя подкаталог en-US и указывает каждый *.txt файл в каталоге . Параметр Pattern задает соответствие вопросительного знака (?) в каждом файле. Обратная косая черта (\) используется в качестве escape-символа и необходима, так как вопросительный знак (?) является квантификатором регулярного выражения. Select-String отображает выходные данные в консоли PowerShell. Имя файла и номер строки предшествуют каждой строке содержимого, содержащей совпадение для параметра Pattern .

Пример 4. Использование Select-String в функции

В этом примере создается функция для поиска шаблона в файлах справки PowerShell. В этом примере функция существует только в сеансе PowerShell. При закрытии сеанса PowerShell функция удаляется. Дополнительные сведения см. в разделе about_Functions.

function Search-Help
{
    $PSHelp = "$PSHOME\en-US\*.txt"
    Select-String -Path $PSHelp -Pattern 'About_'
}
Search-Help
C:\Program Files\PowerShell\7\en-US\default. help.txt:67:    The titles of conceptual topics begin with "About_".
C:\Program Files\PowerShell\7\en-US\default.help.txt:70:    Get-Help About_<topic-name>
C:\Program Files\PowerShell\7\en-US\default.help.txt:93:    Get-Help About_Modules : Displays help about PowerShell modules.
C:\Program Files\PowerShell\7\en-US\default.help.txt:97:    about_Updatable_Help

Функция создается в командной строке PowerShell. Команда Function использует имя Search-Help. Нажмите клавишу ВВОД , чтобы начать добавление операторов в функцию. В командной строке >> добавьте каждый оператор и нажмите клавишу ВВОД , как показано в примере. После добавления закрывающей скобки вы вернелись к командной строке PowerShell.

Функция содержит две команды. Переменная $PSHelp сохраняет путь к файлам справки PowerShell. $PSHOME — это каталог установки PowerShell с подкаталогом en-US , который указывает каждый *. txt файл в каталоге .

Команда Select-String в функции использует параметры Path и Pattern . Параметр Path использует переменную $PSHelp для получения пути. Параметр Pattern использует строку About_ в качестве условия поиска.

Чтобы запустить функцию, введите Search-Help. Команда функции Select-String отображает выходные данные в консоли PowerShell.

Пример 5. Поиск строки в журнале событий Windows

В этом примере выполняется поиск строки в журнале событий Windows. Переменная $_ представляет текущий объект в конвейере. Дополнительные сведения см. в статье about_Automatic_Variables.

$Events = Get-WinEvent -LogName Application -MaxEvents 50
$Events | Select-String -InputObject {$_.message} -Pattern 'Failed'

Командлет Get-WinEvent использует параметр LogName для указания журнала приложений. Параметр MaxEvents получает из журнала 50 последних событий. Содержимое журнала хранится в переменной с именем $Events.

Переменная $Events отправляется по конвейеру в Select-String командлет . Select-String использует параметр InputObject . Переменная $_ представляет текущий объект и message является свойством события. Параметр Pattern возвращает строку Failed и ищет совпадения в $_.message. Select-String отображает выходные данные в консоли PowerShell.

Пример 6. Поиск строки в подкаталогах

В этом примере выполняется поиск определенной текстовой строки в каталоге и во всех его подкаталогах.

Get-ChildItem -Path C:\Windows\System32\*.txt -Recurse | Select-String -Pattern 'Microsoft' -CaseSensitive

Get-ChildItem использует параметр Path для указания C:\Windows\System32*. txt. Параметр Recurse включает подкаталоги. Объекты отправляются по конвейеру в Select-String.

Select-Stringиспользует параметр Pattern и задает строковый Майкрософт. Параметр CaseSensitive используется для сопоставления точного регистра строки. Select-String отображает выходные данные в консоли PowerShell.

Примечание

В зависимости от ваших разрешений в выходных данных могут отображаться сообщения об отказе в доступе .

Пример 7. Поиск строк, не соответствующих шаблону

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

Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\Command.txt -Pattern 'Get', 'Set'  -NotMatch

Командлет Get-Command отправляет объекты по конвейеру в Out-File , чтобы создать файлCommand.txt в текущем каталоге. Select-String использует параметр Path для указания файлаCommand.txt . Параметр Pattern указывает Get и Set в качестве шаблона поиска. Параметр NotMatch исключает Get и Set из результатов.
Select-String отображает выходные данные в консоли PowerShell, которые не включают get или Set.

Пример 8. Поиск строк до и после совпадения

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

Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\Command.txt -Pattern 'Get-Computer' -Context 2, 3
Command.txt:986:Cmdlet          Get-CmsMessage           6.1.0.0    Microsoft.PowerShell.Security
  Command.txt:987:Cmdlet          Get-Command              6.1.2.0    Microsoft.PowerShell.Core
> Command.txt:988:Cmdlet          Get-ComputerInfo         6. 1.0.0    Microsoft.PowerShell.Management
  Command.txt:990:Cmdlet          Get-Content              6.1.0.0    Microsoft.PowerShell.Management
  Command.txt:991:Cmdlet          Get-ControlPanelItem     3.1.0.0    Microsoft.PowerShell.Management
  Command.txt:992:Cmdlet          Get-Credential           6.1.0.0    Microsoft.PowerShell.Security

Командлет Get-Command отправляет объекты по конвейеру в Out-File , чтобы создать файлCommand.txt в текущем каталоге. Select-String использует параметр Path для указания файлаCommand.txt . Параметр Pattern указывает в Get-Computer качестве шаблона поиска. Параметр Context использует два значения: до и после и помечает совпадения шаблонов в выходных данных угловой скобкой (>). Параметр Context выводит две строки перед первым совпадением шаблона и три строки после последнего совпадения шаблона.

Пример 9. Поиск всех совпадений шаблонов

В этом примере показано, как параметр AllMatches находит каждое совпадение шаблона в строке текста. По умолчанию Select-String находит только первое вхождение шаблона в строке текста. В этом примере используются свойства объекта, найденные с помощью командлета Get-Member .

$A = Get-ChildItem -Path "$PSHOME\en-US\*.txt" | Select-String -Pattern 'PowerShell'
$A
C:\Program Files\PowerShell\7\en-US\default.help.txt:3:    PowerShell Help System
C:\Program Files\PowerShell\7\en-US\default.help.txt:6:    Displays help about PowerShell cmdlets and concepts.
C:\Program Files\PowerShell\7\en-US\default.help.txt:9:    PowerShell Help describes PowerShell cmdlets
$A.Matches
Groups   : {0}
Success  : True
Name     : 0
Captures : {0}
Index    : 4
Length   : 10
Value    : PowerShell
$A.Matches.Length
8
$B = Get-ChildItem -Path "$PSHOME\en-US\*.txt" | Select-String -Pattern 'PowerShell' -AllMatches
$B. Matches.Length
9

Командлет Get-ChildItem использует параметр Path . Параметр Path использует переменную $PSHOME , указывающую каталог PowerShell. Оставшаяся часть пути включает в себя подкаталог en-US и указывает каждый *.txt файл в каталоге . Объекты Get-ChildItem хранятся в переменной $A . Переменная $A отправляется по конвейеру в Select-String командлет . Select-String использует параметр Pattern для поиска строки PowerShell в каждом файле.

В командной строке PowerShell отображается содержимое $A переменной. Есть строка, содержащая два вхождения строки PowerShell.

Свойство $A.Matches перечисляет первое вхождение шаблона PowerShell в каждой строке.

Свойство $A.Matches.Length подсчитывает первое вхождение шаблона PowerShell в каждой строке.

Переменная $B использует те же Get-ChildItem командлеты и Select-String , но добавляет параметр AllMatches . AllMatches находит каждое вхождение шаблона PowerShell в каждой строке. Объекты, хранящиеся в $A переменных и $B , идентичны.

Свойство $B.Matches.Length увеличивается, так как для каждой строки учитывается каждое вхождение шаблона PowerShell .

Пример 10. Преобразование объектов конвейера в строки с помощью out-String

Результат ToString() переданного объекта не совпадает с форматированным строковым представлением, созданным системой форматирования PowerShell. Таким образом, может потребоваться Out-String передать объекты в первую очередь.

Передача Out-String в преобразует форматированные выходные данные в один многострочный строковый объект. Это означает, что при Select-String поиске совпадения выводится вся многостронная строка.

PS> $hash = @{
    Name = 'foo'
    Category = 'bar'
}
# !! NO output, due to .ToString() conversion
$hash | Select-String -Pattern 'foo'
# Out-String converts the output to a single multi-line string object
PS> $hash | Out-String | Select-String -Pattern 'foo'
Name                           Value
----                           -----
Name                           foo
Category                       bar
# Out-String -Stream converts the output to a multiple single-line string objects
PS> $hash | Out-String -Stream | Select-String -Pattern 'foo'
Name                           foo

При передаче в Out-String -Stream форматированные выходные данные преобразуются в несколько однострочных строковых объектов. Это означает, что при Select-String поиске совпадения выводится только соответствующая строка.

Параметры

-AllMatches

-CaseSensitive

-Context

-Culture

-Encoding

-Exclude

-Include

-InputObject

-List

-LiteralPath

-NoEmphasis

-NotMatch

-Path

-Pattern

-Quiet

-Raw

-SimpleMatch

Входные данные

PSObject

В этот командлет можно передать по конвейеру любой ToString() объект, имеющий метод .

Выходные данные

MatchInfo

По умолчанию этот командлет возвращает объект MatchInfo для каждого найденного совпадения.

Boolean

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

String

При использовании параметра Raw этот командлет возвращает набор объектов String , соответствующих шаблону.

Примечания

Select-String похож на grep в UNIX или findstr.exe в Windows.

Псевдоним sls командлета появился Select-String в PowerShell 3.0.

Примечание

В соответствии с утвержденными командами для команд PowerShell официальным префиксом псевдонима для Select-* командлетов является sc, а не sl. Таким образом, правильный псевдоним для Select-String должен быть scs, а не sls. Это исключение из этого правила.

При передаче объектов в Select-String:

  • Объекты FileInfo обрабатываются как путь к файлу. При указании Select-String путей к файлам выполняется поиск содержимого файла, а ToString() не представления объекта .
  • Результат ToString() переданного объекта не совпадает с форматированным строковым представлением, созданным системой форматирования PowerShell. Таким образом, может потребоваться Out-String передать объекты в первую очередь. Дополнительные сведения см. в примере 10.

Чтобы использовать Select-String, введите текст, который требуется найти, в качестве значения параметра Pattern . Чтобы указать текст для поиска, используйте следующие условия:

  • Введите текст в строку с кавычками, а затем передайте его в Select-String.
  • Сохраните текстовую строку в переменной, а затем укажите переменную в качестве значения параметра InputObject .
  • Если текст хранится в файлах, используйте параметр Path , чтобы указать путь к файлам.

По умолчанию Select-String интерпретирует значение параметра Pattern как регулярное выражение. Дополнительные сведения см. в разделе about_Regular_Expressions. Для переопределения сопоставления регулярных выражений можно использовать параметр SimpleMatch . Параметр SimpleMatch находит экземпляры значения параметра Pattern во входных данных.

Выходными данными Select-String по умолчанию является объект MatchInfo , который содержит подробные сведения о совпадениях. Сведения в объекте полезны при поиске текста в файлах, так как объекты MatchInfo имеют такие свойства, как Имя файла и Строка. Если входные данные не из файла, эти параметры имеют значение InputStream.

Если вам не нужны сведения в объекте MatchInfo , используйте параметр Quiet . Параметр Quiet возвращает логическое значение (True или False), указывающее, найдено ли совпадение вместо объекта MatchInfo .

При сопоставлении фраз использует текущий язык и региональные параметры, Select-String заданные для системы. Чтобы найти текущий язык и региональные Get-Culture параметры, используйте командлет .

Чтобы найти свойства объекта MatchInfo , введите следующую команду:

Select-String -Path test.txt -Pattern 'test' | Get-Member | Format-List -Property *

  • about_Automatic_Variables
  • about_Comparison_Operators
  • about_Functions
  • about_Quoting_Rules
  • about_Regular_Expressions
  • Get-Alias
  • Get-ChildItem
  • Get-Command;
  • Get-Member
  • Get-WinEvent
  • Out-File

Используйте Windows PowerShell для поиска файлов

Doctor Scripto

27 июня 2016 г. 2 1

Сводка : Используйте Get-Childitem для поиска в файловой системе с помощью PowerShell.

Я сохранил файл где-то на своем компьютере и не могу его найти. Есть ли способ использовать Windows PowerShell, чтобы найти его?

Почетный сценарист, Шон Кирни, сегодня здесь, чтобы показать вам крутой трюк, которым я постоянно пользуюсь. Я использую PowerShell для постоянного поиска вещей!

Почему PowerShell? Ну, если честно, у меня есть плохая, плохая, плохая привычка ставить данные туда, где их быть не должно. Иногда я использовал места, которые индексатор в Windows не отслеживает. В таких ситуациях даже Кортана мне не поможет.

Мы можем использовать Get-Childitem , чтобы довольно легко отобразить список файлов и/или каталогов. В следующем примере перечислены все файлы в корне диска C:

Get-Childitem –Path C:\

Если мы добавим –Recurse , мы можем показать все , к чему у нас есть доступ.

Get-Childitem –Path C:\ -Recurse

На данный момент это ничем не отличается от выполнения следующей команды в командной строке CMD.

Dir C:\*.* /s

Итак, почему PowerShell?

Для поиска PowerShell предлагает нам все то, что мы не видим под капотом. В этой структуре папок должно быть много файлов, к которым я не могу получить доступ. Те выдадут ошибку (по умолчанию красную) и сделают ее очень плохо читается.

Итак, мы говорим PowerShell: «Не надо показывать мне эти мелкие ошибки, просто продолжайте».

Get-Childitem –Path C:\ -Recurse -ErrorAction SilentlyContinue

Но как мы можем использовать это как средство поиска? Get-Childitem включает два дополнительных параметра, — включить и — исключить . Их функции довольно просты.

Параметр -include говорит: «Показывать мне в поиске только эти файлы» и -exclude говорит: «Держи это подальше от меня».

Как говорили в телевизоре: «Но подождите! Есть еще кое-что!». Иногда причина, по которой вы не можете найти файл, заключается в том, что он хранится во временной папке Outlook.

Этот сводил меня с ума! Поскольку папка Temporary является скрытой, вы часто будете ее пропускать, как и Get-Childitem . Чтобы обойти эти проблемы, добавьте параметр –force , чтобы он также мог проверять эти папки.

Get-Childitem –Path C:\ -Recurse –force -ErrorAction SilentlyContinue

Теперь мы можем использовать эту ту же команду, чтобы показать только документы Word, к которым у меня есть доступ, или даже все файлы, к которым я вставьте буквы HSG. Да, есть вероятность, что я слишком много смотрел «Вавилон 5» и сохранил файл в папке «Изображения».

Get-Childitem –Path C:\ -Include *HSG* -Recurse -ErrorAction SilentlyContinue

К сожалению, подтягивает все, а я имею в виду все . с буквами HSG, включая названия папок. Мы можем указать ему показывать только файлов с помощью PowerShell. Это было введено в версии 3 PowerShell.

Get-Childitem –Path C:\ -Include *HSG* -File -Recurse -ErrorAction SilentlyContinue

Мы также можем использовать параметр -Exclude , чтобы сказать: «Не показывать мне TMP, MP3 , или файлы JPG.:

Get-Childitem –Путь C:\ -Включить *HSG* -Исключить *.JPG,*.MP3,*.TMP -File -Recurse -ErrorAction SilentlyContinue

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

Вы сделали работу в пятницу. Вы даже забыли имя файла! Как же отличить от ?

В PowerShell мы можем довольно легко отфильтровать файлы по дате и времени.

Прямо сейчас давайте назовем дату 24 июня 2016 года. Я не планирую длинные выходные, но, эй, я может заболеть в понедельник, так что это возможно 😉

Есть более интересные способы сделать это, но я собираюсь использовать Get-Date , потому что он работает на международном уровне. Сначала укажите год, месяц и день.

$FindDate=Get-Date -Год 2016 -Месяц 06 -День 24

Имея эту информацию, я могу сначала выделить две вещи. Во-первых, покажи мне все мои документы Word, только файлы, на всем диске C:, и держи сообщения об ошибках при себе, PowerShell.

Get-ChildItem -Path C:\ -Include *.doc,*.docx -File -Recurse -ErrorAction SilentlyContinue

Теперь я могу использовать Where-Object для отображения только файлов, созданных с день, который я сохранил в $FindDate . Это будет включать все, начиная с 00:00 утра того же дня. Мы сравним список со свойством LastWriteTime , которое является «Время последней записи файла».

Get-ChildItem -Path C:\ -Include *.doc,*.docx -File -Recurse -ErrorAction SilentlyContinue | Где-Объект { $_.LastWriteTime -ge $FindDate}

Эй, подожди. Я немного поработал на выходных. Я хочу только пятницу! Что ж, мы также можем отфильтровать это, используя метод AddDays() для нашей даты и задав ей диапазон в 24 часа!

Get-ChildItem -Path C:\ -Include *. doc,*.docx -File -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -ge $FindDate -and $_.LastWriteTime -le $Finddate.adddays(1) }

Конечно, большинству людей может потребоваться выполнить поиск только в нескольких местах. Get-Childitem можно даже указать «Искать только в этом списке папок». В следующем примере я собираюсь выполнить поиск в папке C:\Users, папке HSG на моем USB-ключе (диск L:) и в папке с именем «Whoops\Not\This\One» на диске X:

Get-Childitem -Path C:\Users, L:\HSG, X:\Whoops\Not\This\One -Включить HSG*.doc? -Recurse

Я надеюсь, что это помогло вам сегодня и расширило ваши возможности в ваших повседневных задачах.

Я приглашаю вас подписаться на Scripting Guys в Twitter и Facebook. Если у вас есть какие-либо вопросы, отправьте им электронное письмо по адресу [email protected] или опубликуйте свои вопросы на официальном форуме разработчиков сценариев. До завтра.

До тех пор всегда помните, что с Great PowerShell приходит Большая Ответственность.

Шон Кирни
Почетный сценарист
MVP

по управлению облаком и центром обработки данных

Опубликовано в Эй, сценарист! Методы написания сценариев Windows PowerShellОтмечен приглашенный блогер Шон Кирни Windows PowerShell

Используйте команду Easy PowerShell для поиска информации в файлах

Doctor Scripto

4 августа 2011 г. 1 0

Сводка : Узнайте, как использовать команду Windows PowerShell для удобного поиска информации в наборе файлов.

 

Эй, сценарист! Мне нужно иметь возможность анализировать несколько файлов для текста, который находится в одной папке. Ненавижу писать сценарий для такой обычной задачи, но боюсь, мне придется это сделать. Вы можете мне помочь?

—SH

 

Здравствуйте, SH,

Microsoft Scripting Guy Ed Wilson. Жена-сценарист и я пытаемся разобраться во всем на этой неделе перед отъездом в Корпус-Кристи, штат Техас, где я буду вести курс Windows PowerShell. Кроме того, мы будем присутствовать на первом собрании группы пользователей PowerShell Корпус-Кристи. Если вы будете в Южном Техасе 9 августа, 2011, вы должны прийти, чтобы проверить это. Это должно быть очень весело. Да, кстати, сегодня у меня встреча с группой пользователей Lincoln SQL Server (ssug). Встреча будет доступна через Live Meeting. Такое ощущение, что эта неделя началась поздно и закончится рано. К счастью, SH, ответ на ваш вопрос — нет, вам не нужно писать скрипт для разбора папки, полной файлов, для определенной строки. На самом деле, это была тема, которая была протестирована на событии для начинающих 6 в Сценарных играх 2011 года.

Решение состоит в том, чтобы использовать Командлет Select-String . Следует иметь в виду, что командлет Select-String читает текстовые файлы; он не может читать более сложные типы файлов, такие как файлы .doc и .docx, созданные Microsoft Word. Когда я попытался найти папку, содержащую документы Word и изображения, которые составляют типичный Hey, Scripting Guy! Сообщение в блоге, Windows PowerShell отобразил кучу тарабарщины в консоли, а затем заблокировал. Это показано на следующем рисунке.

Самый простой способ избежать тарабарщины — указать типы файлов, которые вы хотите найти. Например, если я хочу найти во всех текстовых файлах в каталоге c:\fso шаблон ed (например, мое имя), я включаю подстановочный знак в свою спецификацию пути и выбираю любой файл, который имеет расширение файла . тхт. Командлет Select-String хорош тем, что он ожидает путь , а также шаблон 9.0218 должен быть строкой, поэтому мне не нужно использовать кавычки ни для шаблона, ни для пути. Я могу использовать следующую команду для поиска в папке c:\fso файлов с расширением . txt с расширением и содержит шаблон, соответствующий ed :

Select-String -Path c:\fso\*.txt -pattern ed

Команда и соответствующий вывод показаны на следующем рисунке.

Если я использую командлет Get-Command ( gcm — это псевдоним для этого командлета), чтобы изучить синтаксис командлета Select-String , я вижу, что как параметры пути , так и параметры шаблона будут принимать массив строк. Это означает, что я могу использовать трюк с подстановочными знаками с расширениями файлов для одновременного поиска нескольких файлов. Чтобы изучить только синтаксис командлета Select-String , я использовал командлет Get-Command и передал вывод в Select-Object 9.Командлет 0194 ( выберите — это псевдоним). Затем я решил расширить свойство определения . Результирующая команда показана здесь:

gcm select-string | select -expand определение

Команда и связанный с ней вывод показаны на следующем рисунке.

Поскольку я могу предоставить массив строк для параметра path , я могу искать оба . журнал файлов и . txt файлов одновременно. В моей исправленной Select-String , я ищу в папке c:\fso оба файла . тхт и . журналов файлов. Я просматриваю оба типа файлов на предмет соответствия шаблону ed. Переработанная команда показана здесь:

Select-String -Path c:\fso\*. txt, c:\fso\*.log -pattern ed

Команда и связанные с ней выходные данные показаны на следующем рисунке.

Поскольку параметр шаблона также принимает массив строк, я также могу выполнять поиск в файлах . txt и файл . файлы журнала для строк ed и teresa . Команда для поиска в папке c:\fso обоих файлов . txt и для . log , а поиск совпадений шаблонов с ed и teresa показан на следующем рисунке.

В дополнение к прямому использованию параметра пути в командлете Select-String может быть проще использовать Get-Childitem 9Командлет 0194 для более детального управления анализируемыми файлами. В следующей команде я использую команду dir (псевдоним для командлета Get-ChildItem ) и указываю путь c:\fso (путь не отображается в команде, поскольку это параметр по умолчанию). ). включаю только. тхт и . файлы журнала (я использую –I и полагаюсь на завершение параметра, чтобы указать параметр include . Я делаю то же самое с переключатель recurse (я просто использую букву r ). Я передаю результаты командлету Select-String и ищу шаблон fail ( шаблон является параметром по умолчанию и поэтому опущен в команде). Здесь показана длинная версия команды:

Get-ChildItem -Path c:\fso -Include *.txt, *.log -Recurse | Select-String -Pattern fail

Вот пример более короткой формы команды.

каталог c:\fso -I *.txt, *.log -R | Ошибка выбора строки

Здесь показаны команда и соответствующий вывод.

Интересно, что приведенный выше вывод отображает информацию из файла install.log, а также ряд сбоев. Я решаю, что хотел бы видеть как успехи, так и неудачи. Я модифицирую команду, добавляя к шаблону слово success . Здесь показана измененная команда:

dir c:\fso -I *.txt, *.log -R | Select-String сбой, успех

 

Когда я просматриваю вывод предыдущей команды, я вижу появляющуюся закономерность: на всех серверах установка не удалась.