Mona Coder
Mona Coder

Reputation: 6316

Appending string to the end of all file names in PowerShell

I have files look like

data.svg
map.svg
aplicationp.svg
...
*.svg

I am trying to add -b string to the end of all files names bu using power shell rename command like

D:\icons> Dir | Rename-Item -NewName {$_.name -replace ".","-b."}

to get these

data-b.svg
map-b.svg
application-b.svg

but this is not changing anything. How can I achieve this?

Upvotes: 0

Views: 3177

Answers (2)

Ryan Bolger
Ryan Bolger

Reputation: 1295

Powershell's -replace operator is based on regular expressions. And since . is a wildcard in regex, what should be happening is that each character in the file name is being replaced with the resulting string. So test.txt would become -b.-b.-b.-b.-b.-b.-b in your example.

You likely want to use the Replace method of the .NET String type like this instead.

dir | Rename-Item -NewName { $_.Name.Replace('.','-b.') }

If you want to keep using -replace, you need to escape the . in your expression like this.

dir | Rename-Item -NewName { $_.Name -replace '\.','-b.' }

Both of these have a couple edge case problems that you may want to avoid. The first is narrowing the scope of your dir (which is just an alias for Get-ChildItem) to avoid including files or directories you don't actually want to rename. The second is that a simple replace in the file name doesn't account for file names that contain multiple dots. So you may want to ultimately do something like this if you only care about SVG files that may have multiple dots.

Get-ChildItem *.svg -File | Rename-Item -NewName { "$($_.BaseName)-b$($_.Extension)" }

Upvotes: 5

SergeantBiggs
SergeantBiggs

Reputation: 34

The replace operator uses regex. Therefore your . needs to be escaped, otherwise it just stands for any character. I would generally make sure to be as specific as possible when writing regexes. The following is a possible solution

Get-ChildItem *.svg | Rename-Item -NewName { $_.name -Replace '\.svg$','-c.svg' }

The $ anchors the expression to the end of the string which makes sure it only changes the extension and not any other text inside the file names.

Upvotes: 1

Related Questions