将字符串追加到PowerShell中所有文件名的末尾

将字符串追加到PowerShell中所有文件名的末尾,powershell,Powershell,我的文件看起来像 data.svg map.svg aplicationp.svg ... *.svg 我正在尝试使用powershell重命名命令将-b字符串添加到所有文件名的末尾,如 D:\icons> Dir | Rename-Item -NewName {$_.name -replace ".","-b."} 要得到这些 data-b.svg map-b.svg application-b.svg 但这并没有改变任何事情。如何实现这一点?Powershell的-replace

我的文件看起来像

data.svg
map.svg
aplicationp.svg
...
*.svg
我正在尝试使用powershell重命名命令将-b字符串添加到所有文件名的末尾,如

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

data-b.svg
map-b.svg
application-b.svg
但这并没有改变任何事情。如何实现这一点?

Powershell的-replace操作符基于正则表达式。从那以后。是正则表达式中的通配符,应该发生的是,文件名中的每个字符都将替换为结果字符串。因此,在您的示例中,test.txt将变成-b.-b.-b.-b.-b.-b.-b

您可能希望像这样使用.NET字符串类型的方法

dir | Rename-Item -NewName { $_.Name.Replace('.','-b.') }
如果您想继续使用-replace,则需要退出。用你这样的表情

dir | Rename-Item -NewName { $_.Name -replace '\.','-b.' }
这两种情况都有一些您可能希望避免的边缘情况问题。第一个是缩小dir的范围,dir只是Get ChildItem的别名,以避免包含实际上不想重命名的文件或目录。第二个问题是,文件名中的简单替换不能解释包含多个点的文件名。因此,如果您只关心可能有多个点的SVG文件,那么您可能希望最终执行类似的操作

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

replace操作符使用regex。所以你的。需要逃逸,否则它只是代表。我通常会确保在编写正则表达式时尽可能具体。下面是一个可能的解决方案

Get-ChildItem *.svg | Rename-Item -NewName { $_.name -Replace '\.svg$','-c.svg' }
$将表达式锚定到字符串的末尾,以确保它只更改扩展名,而不更改文件名中的任何其他文本