簡體   English   中英

Powershell 重命名包含方括號的動態文件名,來自目錄中的文件類型掃描

[英]Powershell Rename dynamic filenames containing square brackets, from the filetype scans in the directory

我不太了解(在細節和細節上)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

如果使用管道,則無需擔心 escaping 路徑。 這是因為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值完全按照鍵入的方式綁定(文字/逐字字符串)。 Get-ChildItem -Path接受通配符,但Rename-Item -Path不支持通配符。 然而,在解析命令時,PowerShell 似乎仍然很關心。 如果您必須在接受通配符的-Path參數中轉義某些通配符,則雙引號路徑需要 4 個反引號,而單引號路徑需要 2 個反引號。 這是因為需要兩個級別的轉義。

即使在條件語句中對單個字符串使用-match時,匹配成功時也會更新$matches自動變量。 使用語法$matches.capturegroupname matches.capturegroupname 或$matches[capturegroupname]訪問捕獲組匹配。 由於您沒有命名捕獲組,因此系統自動將其命名為1 圍繞捕獲組的第二組()將是2 重要的是要記住,當-matchFalse時, $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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM