【问题标题】:Error with Powershell add suffix to filenames based on prefixPowershell根据前缀向文件名添加后缀时出错
【发布时间】:2020-11-07 23:03:02
【问题描述】:

所以我有一个 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”。

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

【问题讨论】:

  • 一种非正则表达式的方法是拆分点上的.BaseName,修剪项目,使用任何所需的分隔符以所需的顺序连接它们,最后从它们中创建一个文件名以供使用打电话给Rename-Item。 [咧嘴]

标签: regex powershell rename file-rename batch-rename


【解决方案1】:

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

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

【讨论】:

  • 啊,是的,这就是我要找的,谢谢。所以这是我应该转移“\”的正则表达式。在括号之外,所以它不是 $matches[1] 的一部分,谢谢,这是有道理的。我试图子串,因为我最初将点作为 $matches[1] 的一部分包含在内,但这是一个更优雅的解决方案。
【解决方案2】:

这就是我要做的事情

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

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

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

【讨论】:

  • 如果我问你关于 -replace 的问题你介意吗?因为 '$2 $1$3' 是中间必要的空间,有什么区别吗?
  • @JohnSmith 您希望文件名的文本部分和数字之间有一个空格,所以是的,空格是必要的。 ("{0}{1}{2}" -f $matches[2],' ', $matches[1]... 中的 ' ' 做同样的事情。)
猜你喜欢
  • 2018-11-10
  • 2023-03-05
  • 2021-09-07
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多