rename multiple files using substring of the filename - powershell

I have 100's of file in windows with names like
W-cat_T_1001_s.jpg
W-dog_T_12112_o.jpg
W-rabbit_T_121_w.jpg
i want to rename all the files to its substring for example
cat.jpg
dog.jpg
rabbit.jpg
My approach was to first replace "_T_*" with "" in powerShell something like
DIR| Rename-Item -NewName {$_.Name -replace "_T_*", ""}
this gives error
Rename-Item : Cannot rename because item at 'z' does not exist
i don't know whether it was a right approach and whether it is good to use PowerShell, batch file, java or simple "rename" command will do.

dir | Rename-Item -NewName {$_.Name -replace 'W-(.*)_T_.*','$1.jpg'}

Related

Powershell Changing Bulk File Extensions All At Once

Long story short: need to change multiple file extensions that are . (in Windows, the file extension is just a .) to .csv. I am able to do this in command prompt with this:
ren *. *.csv
But when I try to rename in Powershell, it only changes the first file (result: .csv.csv.csv.csv.csv.csv.csv) while the rest of the files remain untouched. I used this command:
Dir | Rename-Item -NewName { $_.name -replace ".",".csv" }
Can someone explain what I'm doing wrong and how come the first file is being renamed as such? Don't understand why Powershell makes it more complicated since it is based off CMD.
-replace is using regular expression matching where . will match any character so every character is replaced with .csv. Try this to replace *.txt and *.file with *.csv
gci -File | Rename-Item -NewName { $_.name -replace "\.(txt|file)$", ".csv" }
The question has changed. If your files really end in . which I can't actually reproduce then -replace "\.$", ".csv" where \. matches a literal dot and $ matches the end of the line.
If your files have no extension at all then you could do -replace "$", ".csv"
Or you could filter for files with no extension and just add one
gci -File |? Extension -eq '' |% { Rename-Item $_.FullName -NewName "$($_).csv" }
Get-ChildItem -Path C:\ -File | ForEach {Rename-Item $_.FullName -NewName ($_.name).Replace(".txt",".csv")}
Using dot notation, it reads characters as such; meaning no need in escaping any special chars.

rename multiple pdf files thru CMD

Have 2500 pdf files in a folder with fixed length name with a delimiter " _ "
200422028240000148_8393929.pdf
742022028240000014_4366273.pdf
Need to rename with first name available before the delimiter
200422028240000148.pdf
742022028240000014.pdf
How can i do with CMD as well powershell without currupting file and also cant use external utility or tool this being production server
This is really basic PowerShell.
Please, take some time to lookup the workings of Get-ChildItem and Rename-Item to figure out how below code works:
Get-ChildItem -Path 'X:\TheFolder' -Filter '*.pdf' -File | Rename-Item -NewName {
($_.BaseName -split '_')[0] + $_.Extension
}

Removing multiple consecutive periods from file names

I am working on cleaning up a file share for a SharePoint migration, and I am writing a script to either remove or replace unwanted characters from file names. I am struggling to remove multiple consecutive periods (file..example.txt as an example of what I am dealing with).
I was able to use the simple replace script below to deal with all of the other objectionable characters, but the script fails when attempting to replace double period errors.
dir -recurse | rename-item -NewName {$_.name -replace ".." , ""}
I expect that a file with a name like file..example.txt to become fileexample.txt, however nothing changes.
As Matt mentioned in the comments, -replace uses regex. In regex, the . character is a wildcard representing any single character. To actually select a dot, you must use \..
The regex for selecting anything with two or more dots is \.\.+ (RegExr)
Therefore, your command should be:
dir -Recurse | Rename-Item -NewName {$_.name -replace "\.\.+" , ""}
However, dir is an alias for Get-ChildItem. It's a good practice when writing scripts to avoid aliases whenever possible as it can create a situation where your script does not work in certain environments. With that in mind, your command should be:
Get-ChildItem -Recurse | Rename-Item -NewName {$_.name -replace "\.\.+" , ""}
You can use .replace() instead, and not have to worry about the regex. Note that Rename-Item is using a delay bind script block https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_parameters?view=powershell-5.1
Get-Childitem -Recurse -Filter *..* |
Rename-Item -NewName { $_.Name.Replace('..','.') } -WhatIf

Renaming multiple files in Windows

I have a folder containing multiple .txt files which have been created by another program. However the program outputs each file with "-Module" in the
filename. eg
filename-Module.txt
filename1-Module.txt
filename2-Module.txt
I would like to know if there's a script or command (Powershell/cmd) that I can run which will iterate over each file and remove the "-Module" from each filename so I simply end up with
filename.txt
filename1.txt
filename2.txt
I have tried using cmd from the directory, with the following:
rename *-Module.txt *txt
This resulted in no change.
You can use get-childitem and pipe it into rename-item.
get-childitem -path 'c:\folderwherefilesarelocated' -recurse |
rename-item -newname {$_.Name -replace "-module", ""}
Relatively straightforward:
Get-ChildItem ComputerName\TestLocation\testfolder -filter "*-module*" | Rename-Item -NewName {$_.name -replace '-module', ''}
Get the items in the folder, look for filenames with "-module" in them, and then replace the "-module" text with an empty string. You can also append a -whatif to see the output before performing this action.

rename file.jpg.jpg to file.jpg using powershell

I inadvertently named over a thousand files as filename.jpg.jpg. My desired end state is to have the file name as filename.jpg. How can I use PowerShell to fix this?
I have tried many examples from blogs and find that the first .jpg is apparently being seen as the file extension. Any assistance would be greatly appreciated as my only alternative is to manually rename all the files.
Try this,
Get-childItem constant* | % {rename-item $_.name ($_.name -replace '.jpg.jpg','.jpg')}
it will replace .jpg.jpg to .jpg
You could use the Get-ChildItem cmdlet to retrieve the files and prefilter it using the -Filter parameter.
You should use the FullName property instead of the Name for the Rename-Item cmdlet whenever your working directory is a diffrent one.
The regexI use here escapes the periods (mentioned by Matt) and also ensures to match the end of the filename ($).
Get-ChildItem -Path 'YOUR_PATH_HERE' -Filter '*.jpg.jpg' |
foreach { Rename-Item $_.FullName ($_.FullName-replace '\.jpg\.jpg$','.jpg') }
Note: If you need to recursively rename the files, you just need to add -recurse to the Get-ChildItemcmdlet.