Powershell 错误根据前缀为文件名添加后缀

Error with Powershell add suffix to filenames based on prefix

所以我在文件夹中有一个 jpg 格式的文件列表,如下所示:

"1.George ABCD.jpg"
"2.George ABCD.jpg"
"3.Mead ABCD.jpg"

所以我想做的是重命名它们,使前缀变成后缀,如下所示:

"George ABCD 1.jpg"
"George ABCD 2.jpg"
"Mead ABCD 2.jpg"

我想让它通过子文件夹递归工作。

我有一个我试过的代码段可以在这里工作:

ls -Recurse |? BaseName -match '^(\d+\.)([^0-9].*)$' |ren -new {"{0}{1}{2}" -f $matches[2],' ', $matches[1].substring(0,1)+ $_.extension}
cmd /c pause

现在的问题是我的代码目前不适用于两位数的名称,例如:

"11.George ABCD.jpg"

相反,它所做的是吐出

"George ABCD 1.jpg"

这不是我想要的,我知道这与正则表达式 d+ 有关,它是一个或多个数字,但我不确定我应该使用什么来使它对一个或多个数字正常工作数字。

也就是说,我希望“11.George ABCD.jpg”的输出为“George ABCD 11.jpg”。

有什么办法可以解决这个问题吗?

是因为$matches[1].substring(0,1)。您总是只使用比赛的第一位数字。您可以通过修改正则表达式中的第一组而不是稍后使用子字符串来获得所需的内容:

ls -Recurse |? BaseName -match '^(\d+)\.([^0-9].*)$' |ren -new {"{0}{1}{2}" -f $matches[2],' ', $matches[1] + $_.extension}

这是我会做的

Get-ChildItem -File -Recurse | ForEach-Object {
    $newname = $_.Name -replace '^(\d+)\.?\s*(.*)(\.jpg)$', ' '
    if ($newname -ne $_.Name) { $_ | Rename-Item -New $newname }
}

它不一定比您的方法更好,但它的移动部件更少,而且换行效果更好。

注意替换字符串周围的单引号,它们是必需的(否则 PowerShell 将尝试获取 $)。