PowerShell重命名多个文件,文件名的特定部分

PowerShell重命名多个文件,文件名的特定部分

我正在尝试重命名多个文件名以相同方式结尾的文件。这些文件目前为:“Foo Bar (U) (V7.9) (USA).txt”“Few Ber Doo Ber (U) (V7.9) (USA).txt”等

我正在尝试删除名称中的“(U) (V7.9) (USA)”部分,并将此部分替换为 (USA)。然后这些文件将被命名为:“Foo Bar (USA).txt”“Few Ber Doo Ber (USA).txt”

我不能完全让它工作,但这是我一直尝试但无济于事的:

get-childItem '* (U) (V7.9) (USA).txt' | rename-item -newname { $_.name -replace '(U) (V7.9) (USA)','(USA)' }

答案1

您尝试替换的几个字符是正则表达式中的特殊字符。它们具有特殊的保留含义,允许您在未“转义”时创建复杂的表达式。为了转义它们,您只需在特殊字符前面添加一个反斜杠即可。示例:

PS C:\> $string = "(U) (V7.9) (USA)"

#Failure
PS C:\> $string -replace "(U) (V7.9) (USA)", "(USA)"
(U) (V7.9) (USA)

#Success
PS C:\> $string -replace "\(U\) \(V7\.9\) \(USA\)", "(USA)"
(USA)

这是一个Powershell 正则表达式参考以防您遇到类似的问题。您可能会注意到,使用的是反引号 ` 字符而不是反斜杠——反引号是 powershell 中的转义字符,但这并不适用于 .NET(Powershell 是基于 .NET 构建的)中的所有正则表达式处理。因此,您可能会在互联网上的 powershell 正则表达式示例中看到两者都使用。

答案2

如果您只想删除“(U)(V7.9)”部分,您也可以使用:

-replace("\(U\) \(V7.9\) ","")

但是你也必须使用括号中的转义符。并且不要忘记下面的空格符,因为我们不想得到双倍空格。

还有一个使用substring(start,length)方法的选项。但是你必须计算“(U) (V7.9)”部分的开头。

$string = "Randomname (U) (V7.9) (USA).txt"
$string.substring(0, $string.length - 20) + $string.substring($string.length - 9)

输出Randomname (USA).txt

20要删除的字符串的第一个字符(在本例中(为)的字符数(从后面开始(U))。是要删除的字符串后的第一个字符(在本例中为,因为我们不想得到双倍空格)9的字符数(从后面开始) 。((USA)

此方法与长度无关Randomname,但仅适用于已知位置和要删除的字符串的长度。无论如何,-replace如果您知道转义字符,则 -Method 更易于使用。我只是想提一下另一种获得所需输出的方法。

相关内容