Tehc
Tehc

Reputation: 689

Rename multiple files with string from .txt file using PowerShell

Im currently working on a programm that needs a .xml file, reads it into a Oracle Database and afterwards exports a new .xml file. But the problem is that the new file has to have the exact same name as the original file.

I saved the original filenames into a .txt file and i'm now trying to search for a keyword inside the lines to rename the right files with the correct names inside the .txt file. Here an example:

My 4 files (exported from the Database):

 PM.Data_information.xml
 PM.Data_location.xml
 PM.Cover_quality.xml
 PM.Cover_adress.xml

Content of Namefile.txt (original names):

 PM.Data_information_provide_SE-R-SO_V0220_657400509_3_210.xml
 PM.Data_location_provide_SE-R-SO_V0220_9191200509_3_209.xml
 PM.Cover_quality_provide_SE-R-SO_V0220_354123509_3_211.xml
 PM.Cover_adress_provide_SE-R-SO_V0220_521400509_3_212.xml

I only worked out how to get a line by selecting the linenumber:

$content = Get-Content C:\Namefile.txt
$informationanme = $content[0]
Rename-Item PM.Data_information.xml -NewName $informationname

Isn't there a way to select that line by searching for the keyword inside the string?

Upvotes: 0

Views: 1302

Answers (2)

Esperento57
Esperento57

Reputation: 17472

other solution ;)

  gci -Path "c:\temp" -File -Filter "*.xml" | % { rni $_.fullname (sls "C:\temp\Namefile.txt" -Pattern ([System.IO.Path]::GetFileNameWithoutExtension($_.fullname))).Line }

Upvotes: 0

Kevin Holditch
Kevin Holditch

Reputation: 5303

$content = Get-Content C:\temp\ps\NewFile.txt
$files = Get-ChildItem c:\temp\ps\ 

$content | 
    %{
        $currentLine = $_
        $file = $files | Where-Object { $currentLine.StartsWith($_.Name.Replace(".xml", "")) } 

        Rename-Item $file.Name $currentLine

    }

This code should do the trick. Note you will need to have all of your files that need renaming in one folder. Set the folder path to the $files variable (currently set to c:\temp\ps). Set the path where your NewFile.txt is to the $content path.

The code works by looping around each line in the NewFile.txt and finding any file where the name matches the start of the line (if there are any files that do not follow this pattern you will obviously need to update the code but hopefully gives you a good starting point).

Upvotes: 1

Related Questions