我正在尝试重命名多个文件名以相同方式结尾的文件。这些文件目前为:“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 更易于使用。我只是想提一下另一种获得所需输出的方法。