duanany
duanany

Reputation: 3

Match string with specific numbers from array

I want to create a script that searches through a directory for specific ".txt" files with the Get-ChildItem cmdlet and after that it copies the ".txt" to a location I want. The hard part for me is to extract specific .txt files string from the array. So basically I need help matching specific files names in the array. Here is an example of the array I'm getting back with the following cmdlet:

$arrayObject = (Get-ChildItem -recurse | Where-Object { $_.Name -eq "*.txt"}).Name

The arrayobject variable is something like this:

$arrayobject = "test.2.5.0.txt", "test.1.0.0.txt", "test.1.0.1.txt",
               "test.0.1.0.txt", "test.0.1.1.txt", "test.txt"

I want to match my array so it returns the following:

test.2.5.0.txt, test.1.0.0.txt, test.1.0.1.txt

Can someone help me with Regex to match the above file names from the $arrayObject?

Upvotes: 0

Views: 84

Answers (4)

duanany
duanany

Reputation: 3

Sorry for the late reply. Just got back in the office today. My question has been misinterpreted but that's my fault. I wasn't clear what I really want to do.

What I want to do is search through a directory and retrieve/extract in my case the (major)version of a filename. So in my case file "test.2.5.0.txt" would be version 2.5.0. After that I will get the MajorVersion and that's 2. Then in an If statement I would check if it's greater or equal to 1 and then copy it to a specific destination. To add some context to it. It's nupkg files and not txt. But I figured it out. This is code:

$sourceShare     = "\\server1name\Share\txtfilesFolder"
destinationShare = "\\server2name\Share\txtfilesFolder"
Get-ChildItem -Path $sourceShare `
              -Recurse `
              -Include "*.txt" `
              -Exclude @("*.nuspec", "*.sha512") `
              | Foreach-Object {
                   $fileName          = [System.IO.Path]::GetFileName($_)
                   [Int]$majorVersion = (([regex]::Match($fileName,"(\d+(.\d+){1,})" )).Value).Split(".")[0]

                   if ($majorVersion -ge 1)
                   {
                      Copy-Item -Path $_.FullName `
                                -Destination $destinationShare `
                                -Force
                   }
              }

If you have anymore advice. Let me know. I would be great to extract the major version without using the .Split method

Grtz

Upvotes: 0

kovkov
kovkov

Reputation: 1

Please try to clarify what the regex should match.

I created a regex which matches out of the given filenames only the files you wanted to retrieve:

"*.[1-9].[0-9].[0-9].txt" 

You can tryout the small check I wrote.

ForEach($file in $arrayobject){
if($file -LIKE "*.[1-9].[0-9].[0-9].txt"){
Write-Host $file
}}

I think the "-LIKE" operator would be better to check if a string matches a regex.

Let me know if this helps.

Upvotes: 0

Theo
Theo

Reputation: 61068

As you already add the -Recurse parameter to Get-ChildItem, you can also use the -Include parameter like this:

$findThese = "test.2.5.0.txt", "test.1.0.0.txt", "test.1.0.1.txt"
$filesFound = (Get-ChildItem -Path 'YOUR ROOTPATH HERE' -Recurse -File -Include $findThese).Name

P.S. without the -Recurse parameter you need to add \* to the end of the rootfolder path to be able to use -Include

Upvotes: 1

Ivan Mirchev
Ivan Mirchev

Reputation: 839

Maybe something like:

$FileList = Get-ChildItem -path C:\TEMP -Include *.txt -Recurse
$TxtFiles = 'test1.txt', 'test3.txt', 'test9.txt'

Foreach ($txt in $TxtFiles) {
    if ($FileList.name -contains $txt) {Write-Host File: $Txt is present}
}

A general rule: Filter as left as possible! Less objects to be processed, less resources to be used, faster to be processed!

Hope it helps!

Upvotes: 0

Related Questions