Search code examples
powershellpowershell-5.0get-childitem

How to take a list of partial file names and return a list of the full file names with PowerShell


I’m wondering how to take a list of partial document names and return a list of the full document names with PowerShell.

I have ton of documents to do this with. We have a naming scheme: HG-xx-xx-###

The full naming scheme for the actual files is: HG-xx-xx-###.x.x_File_Name

I have a lot of different lists of file names like so:

HG-SP-HG-001

HG-WI-BE-005

HG-GD-BB-043

I'm trying to have program return a list of the full file names like so:

HG-SP-HG-001.1.6_Example

HG-WI-BE-005.1.0_Example

HG-GD-BB-043.1.1_Example

I've included both methods I've tried. I give it a list or even just one partial file name and I get nothing back.

I've tried two different ways and I'm at the end of my programming and googling capabilities, any ideas?

$myPath = 'P:\'


$_DocList = READ-HOST "Enter list of document ID's"

$_DocList = $_DocList.Split(',').Split(' ')


#Here I'm not sure if I should do it like so:

$output =

    ForEach($_Doc in $_DocList)
    {
    $find = gci $myPath -Recurse |where{$_.name -contains $($_Doc)}
    Write-Host "$find"
    }

$output | clip


#or like this:

$_DocList | ForEach-Object

{

gci -Path $myPath -Filter $_ -Recurse

       $info = Get-ChildItem $_.FullName | Measure-Object
       if ($info.Count -ne 0) {
              Write-Output "$($_.Name)"
        }
} | clip

Solution

  • Doug Maurer's helpful answer shows a solution based on a wildcard pattern based to the -Filter parameter. Since this parameter only accepts a single pattern, the Get-ChildItem -Recurse call must be called multiple times, in a loop.

    However, since you're using -Recurse, you can take advantage of the -Include parameter, which accepts multiple patterns, so you can get away with one Get-ChildItem call.

    While for a single Get-ChildItem call -Filter performs better than -Include, a single Get-ChildItem -Include call with an array of pattern is likely to outperform multiple Get-ChildItem -Filter calls, especially with many patterns.

    # Sample name prefixes to search for.
    $namePrefixes = 'HG-SP-HG-001', 'HG-WI-BE-005', 'HG-GD-BB-043'
    
    # Append '*' to all prefixes to form wildcard patterns: 'HG-SP-HG-001*', ...
    $namePatterns = $namePrefixes -replace '$', '*'
    
    # Combine Get-ChildItem -Recurse with -Include and all patterns.
    # .Name returns the file name part of all matching files.
    $names = (Get-ChildItem $myPath -File -Recurse -Include $namePatterns).Name