Find the first file that matches a pattern using PowerShell

Solution 1:

You can force PowerShell into returning an array, even when only one item is present by wrapping a statement into @(...):

@(gci *.xls)[0]

will work for each of your three cases:

  • it returns the first object of a collection of files
  • it returns the only object if there is only one
  • it returns $null of there wasn't any object to begin with

There is also the -First parameter to Select-Object:

Get-ChildItem -Filter *.xls | Select-Object -First 1
gci -fi *.xls | select -f 1

which works pretty much identical to the above, except that the list of files doesn't need to be enumerated completely by Get-ChildItem, as the pipeline is aborted after the first item. This can make a difference when there are many files matching the filter.