在 Powershell 中转义括号 - 替换参数不起作用

在 Powershell 中转义括号 - 替换参数不起作用

我想重命名文件:

Howard -((TV) )RED HEADED LEAGUE.mp4

更改为:

Howard - (TV) RED HEADED LEAGUE.mp4

由于 -Replace Powershell 命令使用 regex 正则表达式,因此我这样做来重命名文件:

Get-ChildItem | Rename-Item -NewName {$_.name -replace '\(\(TV\) \)',' \(TV\) '}

但是,输出此错误:

无法重命名指定的目标,因为它代表路径或设备名称。

并且按照谷歌的建议,用反引号转义括号,不会输出任何错误,但不会重命名任何文件:

Get-ChildItem | Rename-Item -NewName {$_.name -replace '`(`(TV`) `)',' `(TV`) '}

我怎样才能做到这一点?谢谢。

答案1

这有效:

Get-ChildItem | Rename-Item -NewName {$_.name -replace '\(\(TV\) \)',' (TV) '}

之所以有效,是因为第一个参数(搜索参数)'\(\(TV\) \)'必须是 regex 正则表达式。因此,括号中需要转义字符。

但是,第二个参数(替换参数)' (TV) '被视为纯文本字符串,而不是正则表达式。因此,无需转义括号,例如单引号除外。

答案2

有两种方法可以完成这项工作。[咧嘴笑]如果您有大量这样的替换,则正则表达式版本可能会更快。

第一个使用正则表达式将目标模式替换为替换模式。目标模式根据需要使用内置[regex]::Escape()方法应用正则表达式转义。

第二种使用字符串.Replace()方法来替换((with() )with )

$InString = 'asf ((tv) ) qwe'

$Target = '((tv) )'
$Subst = ' (tv) '

$InString -replace [regex]::Escape($Target), $Subst
$InString.Replace('((', ' (').Replace(') )', ') ')

输出 ...

asf  (tv)  qwe
asf  (tv)  qwe

相关内容