I would like to search for a folder in a specific directory and subdirectorys.
I tried googling it, but didn’t really find any usefull examples.
wonea
4,73317 gold badges85 silver badges139 bronze badges
asked Sep 30, 2013 at 10:21
1
Get-ChildItem C:test -recurse | Where-Object {$_.PSIsContainer -eq $true -and $_.Name -match "keyword"}
I believe there’s no dedicated cmdlet for searching files.
Edit in response to @Notorious comment:
Since Powershell 3.0 this is much easier, since switches -Directory
and -File
were added to Get-ChildItem
. So if you want it short you’ve got:
ls c:test *key* -Recurse -Directory
With command alias and tab-completion for switches it’s a snap. I just missed that the first time.
answered Sep 30, 2013 at 11:00
AdamLAdamL
12.3k5 gold badges49 silver badges74 bronze badges
5
Here is my version, which is only slightly different:
gci -Recurse -Filter "your_folder_name" -Directory -ErrorAction SilentlyContinue -Path "C:"
some more info:
-Filter "your_folder_name"
From documentation: Filters are more efficient than other parameters. The provider applies filter when the cmdlet gets the objects rather than having PowerShell filter the objects after they’re retrieved. The filter string is passed to the .NET API to enumerate files. The API only supports * and ? wildcards.
-Directory
Only examine directories, also could be -File
-ErrorAction SilentlyContinue
Silences any warnings
-Path "C:"
Specifies a path to start searching from
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7
answered Aug 21, 2020 at 15:49
aturcaturc
1,29812 silver badges18 bronze badges
1
Для поиска файлов через 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 если бы дата была бы ровна. Называется “Операторы сравнения”
Поиск по содержимому файлов через Powershell
Мы можем искать внутри файлов, т.е. вхождение строк:
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 мы можем найти конкретную строку (нельзя использовать * звездочку), то с этим ключом мы можем использовать регулярные выражения.
…
Теги:
#powershell
Get-ChildItem cmdlet in PowerShell is used to get items in one or more specified locations. Using Get-ChildItem, you can find files. You can easily find files by name, and location, search file for string, or find file locations using a match pattern.
Very often, we store files anywhere on the drive where they shouldn’t be put, and later after a few months, we have so many files copied at different locations and remain an unorganized way.
If we try to find a file stored anywhere on the drive, using a manual search or windows provided search filter with wild card characters takes a lot of time and more frustration.
In this article, I will explain different and best possible ways to find files that match a pattern or find files by extension in PowerShell
Using PowerShell Get-ChildItem cmdlet to show a list of files or directories in one or more locations.
The Get-ChildItem cmdlet provides more flexibility for simple or advanced wildcards to find files by a search pattern.
Using Recurse parameter to get items recursively from all the child containers. You can limit the Depth parameter to limit the number of levels to recurse.
Cmdlet: Get-ChildItem
Syntax:
Get-ChildItem [[-Filter] <string>] -LiteralPath <string[]> [-Include <string[]>] [-Exclude <string[]>] [-Recurse] [-Depth <uint32>] [-Force] [-Name] [-Attributes <FlagsExpression[FileAttributes]>] [-FollowSymlink] [-Directory] [-File] [-Hidden] [-ReadOnly] [-System] [<CommonParameters>]
Let’s understand using PowerShell to find files by name, by extension, or find files recursively with different examples as given below.
Do you know: Using IIS to get a list of websites in PowerShell!
PowerShell Find files by extension in the current directory
To find all files by extension in the current directory that matches wildcard pattern *.txt
PS C:Temp> Get-ChildItem *.txt
Above command, find files in the current directory that matches extension .txt
PowerShell Find all files on the root of drive D:
To find and list all files stored on drive D: location, using Get-ChildItem is given below
PS C:> Get-ChildItem -Path D:
Above Get-ChildItem cmdlet takes D: as path and lists all the directory and files stored on location. It displays results items with Mode, LastWriteTime, and Length Name columns.
PowerShell Find File Recursively using Recurse parameter
To find and list all files stored on drive D: location, using PowerShell Get-ChildItem with Recurse parameter in PowerShell.
PS C:> Get-ChildItem -Path D: -Recurse
Using recurse parameter will list all files that the user has access to, however, doing recurse operation, if the user doesn’t have access to any of the resource items, it will throw an error.
To continue with Recurse operation even in the case of error, using ErrorAction
parameter with silentlyContinue
continue its operation.
PS C:> Get-ChildItem -Path D: -Recurse -ErrorAction SilentlyContinue
PowerShell Tip: How to add a newline to string or variable?
Search for files that do not match using exclude parameter
To find all files in current and subdirectory that do not match PowerShell wildcard *.exe, we can do it using exclude parameter
PS D:Temp> Get-ChildItem -Exclude *.exe -Recurse
Above command, get a list of all files exclude
*.exe files in subdirectories using recurse parameter in PowerShell.
PowerShell Tip: How to search string in files using PowerShell Grep!
Get a list of all files in directory that matches a pattern
To get a list of all files in directory and subdirectory that matches PowerShell wildcard pattern *.doc,*.docx
PS D:Temp> Get-ChildItem -Include *.doc,*.docx -File -Recurse -ErrorAction SilentlyContinue
In the above example, Get-ChildItem uses the Include parameter to find *.doc or *.docx files from the directory or its subdirectories using Recurse parameter.
Use ErrorAction silentlyContinue
to continue with finding files even without having errors.
Above command, search for files and get a list of all files in a directory in PowerShell.
Find file all items in subdirectories match specific filter
Using -Filter parameter to get list of all files from subdirectories that match filter *.txt
PS D:Temp> Get-ChildItem -Filter *.txt -Recurse
Above Get-ChildItem command using Recurse parameter to recursively iterate in folder and subfolders and filter parameter with *.txt to get only *.txt file extension files only.
Above PowerShell script find files recursively with extension.
Cool Tip: Replace text in string using PowerShell!
PowerShell Find Filename containing string
To find all files containing a string in a given directory or subdirectories, use the below command
PS D:Temp> Get-ChildItem -Recurse | Where {$_.Name -match 'Replace'} | Select Fullname FullName -------- D:TempReplace-Method.txt
In the above example, Get-ChildItem uses Recurse parameter to recursively find all files.
Using Where-Object cmdlet to compare name property that matches with ‘Replace’ and returns FullName of the file.
In the above script, search file for string and get file name that matches the string.
We can also use Get-ChildItem alias gci to query and file name containing a string as below
PS D:Temp> gci -Recurse | Where {$_.Name -match 'Replace'} | Select Fullname FullName -------- D:TempReplace-Method.txt
PowerShell Find Files in Directory containing string
To find all files in the directory containing string, use the below command
PS D:Temp> Get-ChildItem -Recurse | Where {$_.DirectoryName -match 'Debug'} | Select Fullname
In the above example, Get-ChildItem use Recurse parameter to recursively find all files in the Directory
Using Where-Object cmdlet to compare DirectoryName property that matches with ‘Debug’ and returns FullName of the files in that directory.
We can also use PowerShell Get-ChildItem alias gci to query and list all files within directory name containing a string as below
PS D:Temp> gci -Recurse | Where {$_.DirectoryName -match 'Debug'} | Select Fullname
PowerShell Tip: How to get MD5 checksum or SHA checksum for file in PowerShell!
PowerShell Find File by WildCard
To find all the files in directory or subdirectories that match PowerShell wildcard
PS D:Temp> Get-ChildItem | Where-Object { $_.Name -match '[a-z].txt$' } Directory: D:Temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 10-07-2021 11:11 196 Replace-Method.txt
In the above example, it finds files using PowerShell wildcard as [a-z].txt$ and gets a list of all files.
Cool Tip: ErrorAction and ErrorVariable parameters in PowerShell!
PowerShell Find Files Older than Specific Days
To find files older than specific days, use PowerShell Get-ChildItem to get file objects and compare file creation date with current date – 15 days.
Get-ChildItem -File | Where-Object {$_.CreationTime -lt (Get-Date).AddDays(-15)} | Select Name, CreationTime | sort CreationTime -Descending
In the above PowerShell script, the first command gets the file object and passes the output to the second command.
Second command, Where-Object
compare file creation date with current date – 15 days using Get-Date cmdlet and passes the output to the third command.
The third command selects file name and file creation date time format and passes the output to the fourth command.
In the last command, sort file creation date-time descending and gets a list of files older than 15 days before.
Conclusion
I hope you find the above article on using the PowerShell Get-ChildItem cmdlet to find files that match search patterns or find files by extension, or name helpful.
I tried to explain different ways to search for files by wildcard, file by name, file by location or directory, or get folders only in the file system.
You can find more topics about PowerShell Active Directory commands and PowerShell basics on the ShellGeek home page.
У данного командлета присутствуют несколько псевдонимов (aliases) – ls, dir, gci.
Разберем аргументы командлета позволяющие выполнить поиск файлов.
Поиск По Маске
Аргументы командлета Get-ChildItem позволяют выполнить поиск файлов. Доступные параметры, маска имени файла (-Filter), стартовая директория поиска (-Path), и возможность рекурсивного поиска в поддиректориях (-Recurse).
Поиск по маске, для примера осуществим вывод всех файлов с расширением ZIP.
# Вывод файлов с раширением *.zip
Get-ChildItem *.zip
Файловые маски не могут содержать регулярных выражений, только стандартные “*” (любое количество символов) и “?” (один любой символ).
# Вывод файлов с раширением *.zip и именем состоящим из трех символов
Get-ChildItem ???.zip
Как можно заметить, указывать параметр -Filter не обязательно, командлет сам понимает что ему была передана фильтрующая маска. Порядок следования параметров без их конкретного указания можно посмотреть во встроенной справке.
# Вывод справки
Get-ChildItem -?
Параметр -Path позволяет задать путь начала поиска. Так же он допускает использовать символы файловых масок. Можно совмещать комбинацию фильтров в параметре -Path и -Filter.
Выведем содержимое диска C:.
# Вывод содержимого указанной директории
Get-ChildItem C:
# То же самое что и выше, но с прямым указанием параметра
Get-ChildItem -Path C:
По умолчанию, выводится только содержимое текущей директории, но для полноценного поиска файлов необходимо выполнить обход всех файлов во всех поддиректориях. Осуществить такой обход позволяет параметр -Recurse.
Попробуем найти все файлы с расширением *.msc на диске C:.
# Вывод всех файлов *.msc на диске C:
Get-ChildItem -Path C: -Filter *.msc -Recurse -ErrorAction SilentlyContinue
Как вы могли заметить, при выводе содержимого диска C: отсутствовали скрытые файлы. Отображение скрытых и системных файлов задается атрибутами, о которых поговорим далее.
Поиск По Атрибутам
По умолчанию, скрытые файлы не попадают выходной список командлета Get-ChildItem. Вывод файлов с различными атрибутами, такими как скрытый, системный и прочее, можно задать с помощью параметра -Attributes.
Возможные значения для данного параметра можно посмотреть во встроенной справке по командлету (Get-ChildItem -?).
Важные, или популярные, атрибуты вынесены в отдельные параметры, а именно -Directory, -File, -System, -Hidden.
Попробуем посмотреть файлы скрытые файлы на диске C:.
# Вывод файлов диска C:
Get-ChildItem C:
# Вывод файлов диска C: включая скрытые
Get-ChildItem C: -Hidden
При указании параметра -Hidden выводятся только скрытые файлы и папки.
С параметром -Attributes все иначе. Он позволяет комбинировать файловые атрибуты. Доступны три операции:
! – NOT, исключает файлы с данным атрибутом (!Directory)
+ – AND, включает файлы со всеми указанными атрибутами (System+Hidden)
, – OR, включает файлы с хотя бы с одним указанным атрибутом (System, Hidden, Directory)
Модификаторы можно комбинировать.
# Вывод файлов диска C: с атрибутами - скрытый, системный, директории
Get-ChildItem C: -Attributes H,S,D
Сами названия атрибутов можно сокращать, что собственно и было продемонстрировано выше.
Поиск По Дате
Список файлов полученный с помощью вышеописанных способов можно отфильтровать по дате. Делается это с помощью передачи результатов выполнения командлета Get-ChildItem командлету Where-Object.
Пример фильтрации вывода команды по дате, с применением псевдонимов.
# Вывод файлов дата которых больше или равна дате 28.10.2019 20:00
ls | ? LastAccessTime -GE (Get-Date "28.10.2019 20:00")
Для командлета Where-Object можно задать так же другие условия, или даже несколько условий. Подробнее об этом можно узнать в справке по данному командлету.
Поиск По Содержимому
Поиск по содержимому, предполагает обход всех файлов с целью найти в них искомый текст. Выполнить данную операцию можно с помощью передачи всех файлов по конвейеру командлету Select-String.
Для примера я создал три текстовых файла с текстом:
1.txt (first)
2.txt (second)
3.txt (first second third)
Структура расположения файлов следующая.
Теперь примеры поиска текста в данных файлах с помощью PowerShell.
# Поиск всех файлов с текстом "first"
Get-ChildItem -Recurse | Select-String "first"
Вывод данной команды немного скудный, нет информации о файлах. Это легко поправить, выполнив передачу полученных данных снова командлету Get-ChildItem. На этот раз воспользуемся псевдонимами для сокращения ввода команд.
# Поиск всех файлов с текстом "first" с подробным выводом информации о файлах
ls -r | Select-String "first" | ls
Использование Найденных Файлов
Полученные списки файлов, всеми вышеописанными способами, можно передавать по конвейеру таким командлетам как Remove-Item, Move-Item, Copy-Item и прочим подобным. Тем самым упрощая работу с полученными файлами.
Итог
В статье было рассмотрено: Как выполнить поиск файлов в командной оболочке PowerShell?
description | ms.date | title |
---|---|---|
This article discusses how to deal with registry key manipulation tasks using PowerShell. |
12/08/2022 |
Working with files folders and registry keys |
This sample only applies to Windows platforms.
PowerShell uses the noun Item to refer to items found on a PowerShell drive. When dealing with
the PowerShell FileSystem provider, an Item might be a file, a folder, or the PowerShell drive.
Listing and working with these items is a critical basic task in most administrative settings, so we
want to discuss these tasks in detail.
Enumerating files, folders, and registry keys
Since getting a collection of items from a particular location is such a common task, the
Get-ChildItem
cmdlet is designed specifically to return all items found within a container such as
a folder.
If you want to return all files and folders that are contained directly within the folder
C:Windows
, type:
PS> Get-ChildItem -Path C:Windows
Directory: Microsoft.PowerShell.CoreFileSystem::C:Windows
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2006-05-16 8:10 AM 0 0.log
-a--- 2005-11-29 3:16 PM 97 acc1.txt
-a--- 2005-10-23 11:21 PM 3848 actsetup.log
...
The listing looks similar to what you would see when you enter the dir
command in cmd.exe
, or
the ls
command in a UNIX command shell.
You can perform complex listings using parameters of the Get-ChildItem
cmdlet. You can see the
syntax the Get-ChildItem
cmdlet by typing:
Get-Command -Name Get-ChildItem -Syntax
These parameters can be mixed and matched to get highly customized output.
Listing all contained items
To see both the items inside a Windows folder and any items that are contained within the
subfolders, use the Recurse parameter of Get-ChildItem
. The listing displays everything within
the Windows folder and the items in its subfolders. For example:
PS> Get-ChildItem -Path C:WINDOWS -Recurse
Directory: Microsoft.PowerShell.CoreFileSystem::C:WINDOWS
Directory: Microsoft.PowerShell.CoreFileSystem::C:WINDOWSAppPatch
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2004-08-04 8:00 AM 1852416 AcGenral.dll
...
Filtering items by name
To display only the names of items, use the Name parameter of Get-Childitem
:
PS> Get-ChildItem -Path C:WINDOWS -Name
addins
AppPatch
assembly
...
Forcibly listing hidden items
Items that are hidden in File Explorer or cmd.exe
aren’t displayed in the output of a
Get-ChildItem
command. To display hidden items, use the Force parameter of Get-ChildItem
.
For example:
Get-ChildItem -Path C:Windows -Force
This parameter is named Force because you can forcibly override the normal behavior of the
Get-ChildItem
command. Force is a widely used parameter that forces an action that a cmdlet
wouldn’t normally perform, although it can’t perform any action that compromises the security of the
system.
Matching item names with wildcards
The Get-ChildItem
command accepts wildcards in the path of the items to list.
Because wildcard matching is handled by the PowerShell engine, all cmdlets that accepts wildcards
use the same notation and have the same matching behavior. The PowerShell wildcard notation
includes:
- Asterisk (
*
) matches zero or more occurrences of any character. - Question mark (
?
) matches exactly one character. - Left bracket (
[
) character and right bracket (]
) character surround a set of characters to be
matched.
Here are some examples of how wildcard specification works.
To find all files in the Windows directory with the suffix .log
and exactly five characters in the
base name, enter the following command:
PS> Get-ChildItem -Path C:Windows?????.log
Directory: Microsoft.PowerShell.CoreFileSystem::C:Windows
Mode LastWriteTime Length Name
---- ------------- ------ ----
...
-a--- 2006-05-11 6:31 PM 204276 ocgen.log
-a--- 2006-05-11 6:31 PM 22365 ocmsn.log
...
-a--- 2005-11-11 4:55 AM 64 setup.log
-a--- 2005-12-15 2:24 PM 17719 VxSDM.log
...
To find all files that begin with the letter x
in the Windows directory, type:
Get-ChildItem -Path C:Windowsx*
To find all files whose names begin with “x” or “z”, type:
Get-ChildItem -Path C:Windows[xz]*
For more information about wildcards, see about_Wildcards.
Excluding items
You can exclude specific items using the Exclude parameter of Get-ChildItem
. This lets you
perform complex filtering in a single statement.
For example, suppose you are trying to find the Windows Time Service DLL in the System32 folder,
and all you can remember about the DLL name is that it begins with “W” and has “32” in it.
An expression like w*32*.dll
will find all DLLs that satisfy the conditions, but you may want to
further filter out the files and omit any win32 files. You can omit these files using the
Exclude parameter with the pattern win*
:
PS> Get-ChildItem -Path C:WINDOWSSystem32w*32*.dll -Exclude win*
Directory: C:WINDOWSSystem32
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 3/18/2019 9:43 PM 495616 w32time.dll
-a--- 3/18/2019 9:44 PM 35328 w32topl.dll
-a--- 1/24/2020 5:44 PM 401920 Wldap32.dll
-a--- 10/10/2019 5:40 PM 442704 ws2_32.dll
-a--- 3/18/2019 9:44 PM 66048 wsnmp32.dll
-a--- 3/18/2019 9:44 PM 18944 wsock32.dll
-a--- 3/18/2019 9:44 PM 64792 wtsapi32.dll
Mixing Get-ChildItem parameters
You can use several of the parameters of the Get-ChildItem
cmdlet in the same command. Before you
mix parameters, be sure that you understand wildcard matching. For example, the following command
returns no results:
Get-ChildItem -Path C:Windows*.dll -Recurse -Exclude [a-y]*.dll
There are no results, even though there are two DLLs that begin with the letter “z” in the Windows
folder.
No results were returned because we specified the wildcard as part of the path. Even though the
command was recursive, the Get-ChildItem
cmdlet restricted the items to those that are in the
Windows folder with names ending with .dll
.
To specify a recursive search for files whose names match a special pattern, use the Include
parameter.
PS> Get-ChildItem -Path C:Windows -Include *.dll -Recurse -Exclude [a-y]*.dll
Directory: Microsoft.PowerShell.CoreFileSystem::C:WindowsSystem32Setup
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2004-08-04 8:00 AM 8261 zoneoc.dll
Directory: Microsoft.PowerShell.CoreFileSystem::C:WindowsSystem32
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2004-08-04 8:00 AM 337920 zipfldr.dll