Powershell найти файлы по расширению
В Powershell есть командлет, похожий на grep в Linux, Select-String. С помощью него мы можем искать как файлы, так и вхождения строк и, по желанию, используя регулярные выражения.
Для поиска внутри файла можно выполнить следующий командлет:
- Path - путь до директории или документа. В моем случае будут искаться все файлы с расширением .txt, т.к. знак * говорит что мы не знаем что находится слева. Если путь не указан, то он используется по умолчанию, откуда запущен powershell.
- Pattern - строка, которую мы ищем внутри файла. Этот ключ используется для регулярных выражений. Для использования простого поиска, без регулярки, нужно ставить -SimpleMatch
Мы можем искать не только в файлах, но и в самих строках:
- InputObject - объект, в котором мы будем искать переменную
- SimpleMatch - простое совпадение. В моем случае их два. Если "hello" или "idk" будет в строке, то команда вернет строку.
Если мы используем путь в какую-то папку, то мы можем включать и исключать какие-то свойства:
- $path - переменная с путем, которая включает все файлы в папке "New Folder".
- Include - включает все файлы. В моем случае с расширением .txt
- Exclude - исключает все файлы, которые начинаются на text.
- CaseSensitive - учет регистра. В powershell, по умолчанию, буква "а" и "А" одинаковые, а с этим ключом они будут разными.
Т.к. командлет ищет только в текущей папке, но мы можем использовать другой, который рассматривался тут, для более глубокого поиска файлов через Powershell:
- Recurse - рекурсивный поиск т.е. поиск по всем папкам включительно.
- Exclude - исключаем файлы с расширением mp3
Если в папке много файлов, то конечно быстрее будет сначала отфильтровать файлы через powershell Get-ChildItem, а затем искать в них нужные строки через Select-String.
С помощью такой команды мы можем исключить файлы, к которым у нас нет доступа иначе может быть ошибка:
- NoMatch - говорит, что нам нужны только те строки, где нет "fix" или дословно "Не совпадает"
- ErrorAction - со значением SilentlyContinue - говорит "не уведомлять об ошибках".
Разницу с Nomatch можно увидеть на картинке:
Если файл или строка в другой кодировке, то мы можем указать дополнительный ключ в виде -Encoding. Он может принимать следующие значения:
Для поиска файлов через Powershell есть командлет ChildItem. С помощью него мы можем фильтровать данные. Например так мы выведем все файлы и папки, которые лежат на диске C.
- Path - где искать. Если его не указать, то powershell будет искать там файлы, откуда он и запущен. Через запятую можно указать несколько директорий.
- Recurse - рекурсивный поиск. Когда этот ключ не установлен, показываются файлы только текущей папки. Когда этот установлен, показываются, в том числе, папки и файлы внутри других папок.
Если у нас ожидаются папки, к которым у нас нет доступа, то мы можем добавить ключ -ErrorAction, что бы процесс поиска не останавливался с ошибкой:
Для поиска нужных элементов у нас есть два ключа: для включения параметра и исключения. Например я знаю точно, что у программы "Калькулятор" файл имеет в названии calc, а расширение exe. При этом не уверен находится ли он в папке Windows или Program Files и включу оба пути. Так же я хочу исключить файлы с расширением msi и словом win:
- Include нужен для поиска вхождения. Знак * говорит, что я не знаю с чего начинается имя файла, но в нем есть calc, я не знаю что идет после, но заканчивается на .exe . Например под эти результаты подходят 1111calc1111.exe или AbcAlc2.exe.
- Exclude говорит, что мне не нужно, т.е. исключит из выдачи. Это файлы заканчивающиеся на .msi и начинающиеся на win.
- Force этот ключ позволяет искать в скрытых файлах и папках
Если мы используем Include и не используем Recurse, то знак * обязателен в Path иначе результат будет пустой.
Подсчет четных чисел в файле
У меня есть файл 'file.txt' со следующим содержанием:
Шаблон регулярного выражения '\d*\.?\d*' говорит, что мы ищем число, после которого может быть точка, после которого могут быть еще числа. Таким образом мы захватим целые и числа с плавающей точкой.
Для выделения таких чисел из строк нужно использовать Select-String:
Нам нужно отформатировать вывод убрав пустые строки и получить значения свойства Value:
Мы можем вернуть остаток от деления использовав %. Если число делится на 2 с остатком 0, то оно будет четным:
Как выполнить поиск файлов в командной оболочке PowerShell?
Поиск По Содержимому
Поиск по содержимому, предполагает обход всех файлов с целью найти в них искомый текст. Выполнить данную операцию можно с помощью передачи всех файлов по конвейеру командлету Select-String .
Для примера я создал три текстовых файла с текстом:
1.txt (first)
2.txt (second)
3.txt (first second third)
Структура расположения файлов следующая.
Теперь примеры поиска текста в данных файлах с помощью PowerShell.
Командлет Поиска Файлов
Поиск файлов в PowerShell осуществляется с помощью командлета Get-ChildItem . Вызов данного командлета без аргументов выполнит вывод содержимого текущей директории.
У данного командлета присутствуют несколько псевдонимов (aliases) - ls , dir , gci .
Разберем аргументы командлета позволяющие выполнить поиск файлов.
Поиск по содержимому файлов через Powershell
Мы можем искать внутри файлов, т.е. вхождение строк:
- SimpleMatch - строка, которую мы хотим найти внутри файла
В случае выше, для всего что слева от pipeline | , будет идти поиск внутри файлов на упоминание строки fixmypc.
Командлет Select-String может использоваться для поиска файлов:
Разница в том, что он будет искать только в текущей папке, а не во вложенных. Он так же будет искать вхождение в каждом файле, что при большом объеме существенно увеличит время работы. Т.е. эта команда предназначена уже для отфильтрованных значений, например после Get-ChildItem.
Но в Select-String есть дополнительные ключи, которые могут быть полезны. Вот часть из них:
Для открытия файлов и чтения его содержимого используется команда Powershell Get-Content. В этой статье рассмотрим работу команды с открытием файла, построчным чтением, поиском по содержимому строки на примерах.
Навигация по посту
Поиск По Дате
Список файлов полученный с помощью вышеописанных способов можно отфильтровать по дате. Делается это с помощью передачи результатов выполнения командлета Get-ChildItem командлету Where-Object .
Пример фильтрации вывода команды по дате, с применением псевдонимов.
Для командлета Where-Object можно задать так же другие условия, или даже несколько условий. Подробнее об этом можно узнать в справке по данному командлету.
Использование Найденных Файлов
Полученные списки файлов, всеми вышеописанными способами, можно передавать по конвейеру таким командлетам как Remove-Item , Move-Item , Copy-Item и прочим подобным. Тем самым упрощая работу с полученными файлами.
Summary: Use Get-Childitem to search the files system with PowerShell.
I saved a file somewhere on my computer and can’t find it. Is there a way to use Windows PowerShell to find it?
Honorary Scripting Guy, Sean Kearney, is here today to show you a cool trick I use all the time. I use PowerShell to search for things constantly!
Why PowerShell? Well, to be honest, I have a bad, bad, bad habit of putting data where it shouldn’t be. Sometimes I’d use locations that the Indexer in Windows isn’t watching. In these situations, even Cortana can’t help me.
We can use Get-Childitem to show a list of files and/or directories quite easily. The following example lists all files on the root of Drive C:
Get-Childitem –Path C:\
If we add a –Recurse parameter, we can show everything that we have access to.
Get-Childitem –Path C:\ -Recurse
So far, this is no different from running the following command in the CMD prompt.
So, why PowerShell?
For searching, PowerShell offers us all the things that we don’t see under the hood. In that folder structure, there are bound to be many files that I cannot access. Those will throw an error (red by default) and makes it very hard to read.
So, we tell PowerShell, “Don’t bother showing me those minor errors, just continue.”
Get-Childitem –Path C:\ -Recurse -ErrorAction SilentlyContinue
But, how do we use this as a search tool? Get-Childitem includes two additional parameters, -include and –exclude . Their functions are pretty simple.
The -include parameter says, “Show me only these files in the search,” and -exclude says, “Keep that stuff out of my way.”
As the person on TV used to say, “But wait! There’s more!”. Sometimes the reason you can’t find a file is because it was stored in the Temporary Outlook folder.
That used to drive me bananas! Because Temporary is a hidden folder, you often will miss that, and so will Get-Childitem. To bypass those issues, add the –force parameter to let it examine those folders as well.
Get-Childitem –Path C:\ -Recurse –force -ErrorAction SilentlyContinue
We could now use this same command to show only the Word documents that I can access or maybe even all the files that I put the letters, HSG, in. Yes, odds are that I was watching too much Babylon 5 and stored a file in my Pictures folder.
Get-Childitem –Path C:\ -Include *HSG* -Recurse -ErrorAction SilentlyContinue
Unfortunately, it pulls up everything, and I mean everything. with the letters, HSG, in it, including folder titles. We can tell it to show only files by using PowerShell. This was introduced in version 3 of PowerShell.
Get-Childitem –Path C:\ -Include *HSG* -File -Recurse -ErrorAction SilentlyContinue
We can also use the the -Exclude parameter to say, “Don’t show me any TMP, MP3, or JPG files.:
Get-Childitem –Path C:\ -Include *HSG* -Exclude *.JPG,*.MP3,*.TMP -File -Recurse -ErrorAction SilentlyContinue
Here is where things really get powerful. Let’s get right down to the nitty gritty. Imagine that it was a really long weekend.
You did the work on Friday. You even forgot the file name! Just how do you sort that out?
In PowerShell, we can filter out files based upon date and time quite easily.
Right now, let’s get the date for June 24, 2016. I’m not planning on this being a long weekend but, hey, I could be sick on Monday so, it’s possible 😉
There are fancier ways of doing this, but I’m going to use Get-Date because it works internationally. First, supply the year, month, and day.
$FindDate=Get-Date -Year 2016 -Month 06 -Day 24
With this information, I can first off target two things. First, show me all my Word documents, files only, on the entire C: drive, and keep the error messages to yourself, PowerShell.
Get-ChildItem -Path C:\ -Include *.doc,*.docx -File -Recurse -ErrorAction SilentlyContinue
Now I can use Where-Object to show only files that were created since the day that I stored in $FindDate. This will include everything since 12:00 AM the morning of that day. We will compare the list against the LastWriteTime property, which is the “Last Time the File was Written to.”
Get-ChildItem -Path C:\ -Include *.doc,*.docx -File -Recurse -ErrorAction SilentlyContinue | Where-Object
Hey, wait. I did some work on the weekend. I only want Friday! Well, we can filter on that, too, by using the AddDays() method to our date and give it a range of 24 hours!
Get-ChildItem -Path C:\ -Include *.doc,*.docx -File -Recurse -ErrorAction SilentlyContinue | Where-Object
Of course, most people might want to search only a few spots. Get-Childitem can even be told to “Search only this list of folders.” In the following example, I am going to search the C:\Users folder, an HSG folder on my USB key (Drive L: ), and a folder named “Whoops\Not\This\One” on Drive X:
Get-Childitem -Path C:\Users, L:\HSG, X:\Whoops\Not\This\One -Include HSG*.doc? -Recurse
I hope this helped you along today and empowered you a little further in your daily tasks.
Until then always remember that with Great PowerShell comes Great Responsibility.
Sean Kearney Honorary Scripting Guy Cloud and Datacenter Management MVP
Поиск файлов по содержимому
Get-Content не позволяет искать и открывать фалы находящиеся внутри других каталогов. Такой поиск называется рекурсивным и он доступен в Get-ChildItem.
В следующем примере мы вернем файлы из всех каталогов и подкаталогов:
File - возвращает только файлы. Каталоги нам не нужны.
С Get-ChildItem вы так же можете использовать Include,Exclude и Filter, которые были рассмотрены раннее. Использовать эти ключи лучше всего в первой команде т.к. это будет работать быстрее.
Через конвейер мы сможем открыть каждый файл, а с Select-Sting проверить есть ли в нем нужный текст. Так мы найдем файл с Powershell, который содержит строку '127.0.0.1' в папке Windows:
Если убрать параметр Raw, то у нас выведется только та строка, которую мы искали:
Что бы текст передавался полностью, а не построчно - используйте параметр Raw:
Если вам вдруг понадобится выводить по 2 или более строк за раз, можно указать их количество через ReadCount:
Ограничение вывода строк
Можно ограничить вывод содержимого файла указав количество нужных строк в начале или конце:
- Head - выведет указанное количество строк с начала;
- Tail - выведет указанное количество строк с конца.
Так будут выведены только первые 5 строк:
Создание и изменение в Powershell NTFS разрешений ACL
Полное и построчное чтение с поиском
По умолчанию, если мы будем передавать результат команды через конвейер Powershell вывод будет построчный. Это может составить проблему, так как при дополнительных условиях у нас будет возвращаться одна строка, а не весь текст:
Поиск файлов через Powershell по дате
Теперь попробуем найти файлы, которые были созданы за последнюю неделю. Для этого, сначала, объявим переменную с датой:
Не обязательно все заполнять, но в таком случае значения будут приняты по умолчанию (от текущего дня).
Затем передадим эти значения в наш поиск:
- | это конвейер или Pipline, он говорит о том, что к каждому объекту слева нужно применить действия справа
- Where-Object
- -ge $date - значит, что объект должен быть больше или равен (Greater than or equal) нашей переменной с датой. Если бы мы хотели узнать до определенной даты, мы должны были бы указать -le $date, -eq если бы дата была бы ровна. Называется "Операторы сравнения"
Поиск По Атрибутам
По умолчанию, скрытые файлы не попадают выходной список командлета Get-ChildItem . Вывод файлов с различными атрибутами, такими как скрытый, системный и прочее, можно задать с помощью параметра -Attributes.
Возможные значения для данного параметра можно посмотреть во встроенной справке по командлету ( Get-ChildItem -? ).
Важные, или популярные, атрибуты вынесены в отдельные параметры, а именно -Directory, -File, -System, -Hidden.
Попробуем посмотреть файлы скрытые файлы на диске C:\.
При указании параметра -Hidden выводятся только скрытые файлы и папки.
С параметром -Attributes все иначе. Он позволяет комбинировать файловые атрибуты. Доступны три операции:
! - NOT, исключает файлы с данным атрибутом (!Directory)
+ - AND, включает файлы со всеми указанными атрибутами (System+Hidden)
, - OR, включает файлы с хотя бы с одним указанным атрибутом (System, Hidden, Directory)
Модификаторы можно комбинировать.
Сами названия атрибутов можно сокращать, что собственно и было продемонстрировано выше.
Поиск По Маске
Аргументы командлета Get-ChildItem позволяют выполнить поиск файлов. Доступные параметры, маска имени файла (-Filter), стартовая директория поиска (-Path), и возможность рекурсивного поиска в поддиректориях (-Recurse).
Поиск по маске, для примера осуществим вывод всех файлов с расширением ZIP.
Файловые маски не могут содержать регулярных выражений, только стандартные "*" (любое количество символов) и "?" (один любой символ).
Как можно заметить, указывать параметр -Filter не обязательно, командлет сам понимает что ему была передана фильтрующая маска. Порядок следования параметров без их конкретного указания можно посмотреть во встроенной справке.
Параметр -Path позволяет задать путь начала поиска. Так же он допускает использовать символы файловых масок. Можно совмещать комбинацию фильтров в параметре -Path и -Filter.
Выведем содержимое диска C:\.
По умолчанию, выводится только содержимое текущей директории, но для полноценного поиска файлов необходимо выполнить обход всех файлов во всех поддиректориях. Осуществить такой обход позволяет параметр -Recurse.
Попробуем найти все файлы с расширением *.msc на диске C:\.
Как вы могли заметить, при выводе содержимого диска C:\ отсутствовали скрытые файлы. Отображение скрытых и системных файлов задается атрибутами, о которых поговорим далее.
Получение данных
Для открытия файла 'C:\text.txt' можно использовать следующую команду:
Если у вас множество файлов или вы не уверены в назывании, то вы можете использовать подстановку. Символы подстановок бывают следующих типов:
- '*' - говорит об неизвестном количестве символов;
- [a,b] - говорит, что в этом месте может быть буква 'a' или 'b';
- ? - обозначает один неизвестный символ.
Каждый из символов выше можно применять вместе и неограниченное число раз, в любой части пути и имени.
В этом примере я открою сразу два файла: lmhosts и hosts:
Следующие примеры вернут аналогичный результат:
Для похожей фильтрации есть следующие параметры, которые так же позволяют использовать символы подстановок:
- Include - в этом параметре мы добавляем шаблон, по которому будем включать файл;
- Exclude - с помощью этого параметра исключает файлы;
- Filter - исключает результаты.
Для каждого из этих параметров есть обязательно условие - использовать знак '*' в конце пути.
Так мы вернем все файлы с расширением '.txt':
В отличие от Filter, в Include и Exclude мы можем использовать несколько значений. В этом примере мы откроем файлы формата '.txt' и '.ini':
Разделение файла
Файл выводится построчно из-за делиметра (разделителя), который по умолчанию равен '\n' (идентификатор новой строки). Мы можем разделить файл иначе, например, использовав точку с запятой:
То есть результат выше - это массив. В массивах Powershell мы можем получать содержимое по индексам. В следующем примере я просто уберу точку с запятой:
Подсчет количества строк
Построчный вывод с командой Powershell позволяет посчитать количество строк во всем файле. Для подсчета используется команда Measure-Object:
Чтения файла под другим пользователем
В этом командлете не предусмотрена возможность открытия файла под другим пользователем. При любых попытках вы будете получать ошибки:
- Access to the path is denied
- The FileSystem provider supports credentials only on the New-PSDrive cmdlet. Perform the operation again without specifying credentials.
Для обхода этих ошибок, если у вас нет другого выхода, нужно использовать Invoke-Command (команда удаленного подключения). Для ее настройки могут потребоваться дополнительные настройки описанные в другой статье.
Сам процесс открытия файла под другим пользователем будет выглядеть так:
Кодировки
В параметре -Encoding можно указать следующие кодировки:
- ASCII
- BigEndianUnicode
- BigEndianUTF32
- Byte
- Default
- OEM
- Unicode
- UTF7
- UTF8
- UTF32
Как искать файлы используя Powershell Get-ChildItem
Непрерывное чтение
С помощью параметра Wait вы можете читать файл, который в этот момент обновляется системой или другим пользователем:
Содержание
Изменение файла с последующей записью
Вы так же можете изменить содержимое файла и перезаписать этот файл. Представим, что вам нужно заменить адрес '127.0.0.1' в строке - это можно сделать так:
Или с помощью регулярного выражения (не точный шаблон):
Для записи в файл у нас есть два варианта. Первый - это использовать перенаправление в виде знака '>', который перезапишет все содержимое файла или создаст новый файл:
Второй вариант - использовать команду Set-Content:
Функции по работе со строками в Powershell
Если нужна только цифра, а не объект, можно сделать так:
Читайте также: