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.

I have an array of custom objects in Powershell. Each object has a unique reference with which it can be looked up in the array and a value I wish to use later which is not necessarily unique. The array is populated in a for loop as below

#Create empty array
$array1 = @()

#Populate array
foreach($otherElement in $otherArray){
  #Create custom array element
  $arrayElement = New-Object PSObject

  #Update Credential element   
  $arrayElement | Add-Member -type NoteProperty -Name 'objRef' -Value $($otherElement.getAttribute("ref") )
  $arrayElement | Add-Member -type NoteProperty -Name 'objValue' -Value $($otherElement.getAttribute("someValue") )

  #Add element to array
  $array1 += $arrayElement
}

After building the array I want to get access to the objValue corresponding to the correct objRef in some way. I know that you can test if an array contains a value using the -contains parameter but I don’t know how to get the index of the object with that value.

Basically this array is acting like a look up table. I want a function to put in an objRef to get out an objValue.

The objValue in this case is a System.Management.Automation.PSCredential, the password for each object is input at runtime for security. At work I have to sometimes install the same software 30 odd times on different machines with the same 5 credentials and figuring this out will help me automate the process reomtely.

Thanks in advance!

asked Jun 16, 2016 at 12:20

Flash_Steel's user avatar

3

PowerShell is .NET based, so everything arrays in .NET can do, they can do in PowerShell. In particular, since they implement IList, they have the .IndexOf method: @(10, 4, 6).indexof(6) returns 2.

Of course, in your particular case a hash table is more appropriate, since looking up values there is constant time while searching through an array takes linear time. This matters little in the case of small arrays, but adds up quickly if you’re doing things in a loop.

answered Jun 16, 2016 at 12:48

Jeroen Mostert's user avatar

Jeroen MostertJeroen Mostert

26.8k2 gold badges51 silver badges84 bronze badges

2

This shows you how you can search in files for specific content with Windows PowerShell. This also “replaces” the Windows command-line utility “findstr”. In the Unix/Linux world, you mostly use the command grep for doing the same. So you can think of Select-String as PowerShell version of Grep. The Select-String cmdlet searches for text and text patterns in input strings and files. You can use Select-String similar to grep in UNIX or findstr in Windows.

grep syntax

grep example

grep "text I search" *.log

In Windows PowerShell we can use the Select-String to search strings in files

Select-String -Path C:temp*.log -Pattern "Contoso"

If you need some more options, for example, you need also check subfolders (-Recurse) or you need additional filter for files you wanna check, you can use the Get-Childitem first.

Get-ChildItem C:temp -Filter *.log -Recurse | Select-String "Contoso"

If you have to copy all the files with a specific content, you can simply add a Copy-Item cmdlet.

Get-ChildItem C:temp -Filter *.log -Recurse |&nbsp;Select-String "Contoso"&nbsp;| Copy-Item -Destination C:temp2

More Information about Select-String on Microsoft Docs. Select-String can also be very useful to count your lines of code in different files using PowerShell.

PS C:> Get-Help Select-String

NAME

Select-String

SYNOPSIS

Finds text in strings and files.

SYNTAX

Select-String [-Path] <string[]> [-Pattern] <string[]> [-AllMatches] [-CaseSensitive] [-Context <Int32[]>] [-Encoding <string>] [-Exclude <string[]>] [-Include <string[]>] [-List] [-NotMatch] [-Quiet] [-SimpleMatch] [<CommonParameters>]

Select-String -InputObject <psobject> [-Pattern] <string[]> [-AllMatches] [-CaseSensitive] [-Context <Int32[]>] [-Encoding <string>] [-Exclude <string[]>] [-Include <string[]>] [-List] [-NotMatch] [-Quiet] [-SimpleMatch] [<CommonParameters>]

DESCRIPTION

The Select-String cmdlet searches for text and text patterns in input strings and files. You can use it like Grep in UNIX and Findstr in Windows with Select-String in PowerShell.

Select-String is based on lines of text. By default, Select-String finds the first match in each line and, for each match, it displays the file name, line number, and all text in the line containing the match.

However, you can direct it to detect multiple matches per line, display text before and after the match, or display only a Boolean value (true or false) that indicates whether a match is found.

Select-String uses regular expression matching, but it can also perform a simple match that searches the input for the text that you specify.

Select-String can display all of the text matches or stop after the first match in each input file. It can also display all text that does not match the specified pattern.

You can also specify that Select-String should expect a particular character encoding, such as when you are searching files of Unicode text.

RELATED LINKS

Online version: http://go.microsoft.com/fwlink/?LinkID=113388
about_Comparison_Operators
about_Regular_Expressions

REMARKS

To see the examples, type: “get-help Select-String -examples”.
For more information, type: “get-help Select-String -detailed”.
For technical information, type: “get-help Select-String -full”.

PS C:>

I hope this gives you an idea of how you can use a grep and findstr replacement in PowerShell using Select-String. Also, have a look at my blog post about how to install PowerShell 6 and PowerShell 7. If you have questions, let me know in the comments.

Tags: Copy-Item, findstr, Findstr in Powershell, Get-ChildItem, grep, grep in Powershell, Microsoft, PowerShell, Powershell findstr, Powershell grep, Search, search content in a file, Search for String, Select-String, String, Windows, Windows findstr, Windows Powershell Last modified: July 7, 2021

About the Author / Thomas Maurer

Thomas works as a Senior Cloud Advocate at Microsoft. He engages with the community and customers around the world to share his knowledge and collect feedback to improve the Azure cloud platform. Prior joining the Azure engineering team, Thomas was a Lead Architect and Microsoft MVP, to help architect, implement and promote Microsoft cloud technology.
 
If you want to know more about Thomas, check out his blog: www.thomasmaurer.ch and Twitter: www.twitter.com/thomasmaurer

У данного командлета присутствуют несколько псевдонимов (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-ItemCopy-Item и прочим подобным. Тем самым упрощая работу с полученными файлами.

Итог

В статье было рассмотрено: Как выполнить поиск файлов в командной оболочке PowerShell?

Добавить комментарий