0

我不太了解(在细节和细节上)Powershell 在处理路径字符串中的方括号(只是因为它在内部多次转义字符串)中的愚蠢和荒谬的问题/错误,我必须在其中使用带有星号的正则表达式(*)匹配/捕捉模式。

我做了大量的谷歌搜索,发现有一种方法[WildcardPattern]::Escape($Filename)可以帮助我Rename-Item这样的动态文件路径,我认为下面的代码可以处理当前文件夹中文件类型扫描结果的动态路径,但令人失望的是,它没有:

Set-Location "$PSScriptRoot"
$MkvFiles = Get-ChildItem -Filter *.mkv -Path $Path
Foreach ($MkvFile in $MkvFiles) {
    $MkvOrigName = [WildcardPattern]::Escape($MkvFile.Name)
    $MkvOrigFullname = [WildcardPattern]::Escape($MkvFile.FullName)
    If ($MkvOrigName -Match '.*(S[0-9]{2}E[0-9]{2}).*') {
        $NewNameNoExt = $MkvOrigFullname -Replace '.*(S[0-9]{2}E[0-9]{2}).*', '$1'
        $NewName = "$NewNameNoExt.mkv"
        Rename-Item $MkvOrigFullname -NewName $NewName
    }
}

Rename-Item当我在包含问题末尾给出的文件的文件夹上运行上述脚本时,我收到以下命令错误:

Rename-Item : An object at the specified path C:\Users\Username\Downloads\WebseriesName Season 
4\WebSeriesName.2016.S04E13.iNTERNAL.480p.x264-mSD`[eztv`].mkv does not exist.
At C:\Users\Username\Downloads\WebseriesName Season 4\BulkFileRenamerFinalv1.ps1:12 char:9
+         Rename-Item $MkvOrigFullname -NewName $NewName
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我正在处理的当前文件夹中的 Webseries 文件路径如下:

WebSeriesName.2016.S04E01.HDTV.x264-SVA[eztv].mkv
WebSeriesName.2016.S04E02.HDTV.x264-SVA[eztv].mkv
....
....
WebSeriesName.2016.S04E12.iNTERNAL.480p.x264-mSD[eztv].mkv
WebSeriesName.2016.S04E13.iNTERNAL.480p.x264-mSD[eztv].mkv

有人可以帮助我一般地解决这个问题,而不需要对文件名字符串包含的内容进行头脑风暴,只要它们包含字符串等S04E01S04E02并且肯定包含方括号?也就是说,如前面提到的代码中所示,我怎样才能转义方括号并将它们重命名为下面给出的名称?

S04E01.mkv
S04E02.mkv
....
....
S04E12.mkv
S04E13.mkv
4

1 回答 1

1

如果使用管道,则无需担心转义路径。这是因为PSPath属性会自动绑定到Rename-Item-LiteralPath上的参数。

Set-Location "$PSScriptRoot"
$MkvFiles = Get-ChildItem -Filter *.mkv -Path $Path
Foreach ($MkvFile in $MkvFiles) {
    If ($MkvFile.Name -Match '.*(S[0-9]{2}E[0-9]{2}).*') {
        $MkvFile | Rename-Item -NewName {"{0}{1}" -f $matches.1,$_.Extension}
    }
}

解释:

-NewName参数支持延迟绑定脚本。所以我们可以使用脚本块来进行属性/字符串操作。

如果路径查询不需要通配符,那么使用-LiteralPath是最好的方法。该-LiteralPath值完全按照键入的方式绑定(文字/逐字字符串)。-PathforGet-ChildItem接受通配符,但-PathforRename-Item不支持通配符。然而,在解析命令时,PowerShell 似乎仍然很在意。如果您必须在-Path接受通配符的参数中转义某些通配符,则双引号路径需要 4 个反引号,而单引号路径需要 2 个反引号。这是因为需要两个级别的转义。

-match即使在条件语句中对单个字符串使用$matches时,匹配成功时也会更新自动变量。使用语法$matches.capturegroupname或访问捕获组匹配$matches[capturegroupname]。由于您没有命名捕获组,它是1由系统自动命名的。围绕捕获组的第二()组将是2. 重要的是要记住 when -matchis False$matches不会从其先前的值更新。


-Path处理支持通配符的参数中的通配符示例:

# Using double quotes in the path
$Path = "WebSeriesName.2016.S04E01.HDTV.x264-SVA````[eztv].mkv"
Get-ChildItem -Path $Path

# Using single quotes in the path
$Path = "WebSeriesName.2016.S04E01.HDTV.x264-SVA``[eztv].mkv"
Get-ChildItem -Path $Path

# Using LiteralPath
$Path = "WebSeriesName.2016.S04E01.HDTV.x264-SVA[eztv].mkv"
Get-ChildItem -LiteralPath $Path
Rename-Item -LiteralPath $Path -NewName 'MyNewName.mkv'

# Using WildcardPattern Escape method
$Path = 'WebSeriesName.2016.S04E01.HDTV.x264-SVA[eztv].mkv'
$EscapedPath = ([WildcardPattern]::Escape([WildcardPattern]::escape($path)))
Get-ChildItem -Path $EscapedPath
于 2020-07-27T15:16:22.427 回答