[英]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
有人可以幫助我一般地解決這個問題,而無需使用文件名字符串包含的內容,只要它們包含S04E01
, S04E02
等字符串並且肯定包含方括號? 也就是說,我怎樣才能逃避方括號並將它們重命名,如前面提到的代碼所示,為下面給出的名稱?
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
。 重要的是要記住,當-match
為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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.