Powershell 的.Extension方法似乎無法識別雙重擴展名。結果是這樣的:
Get-ChildItem -Path:. | Rename-Item -NewName {
'{0}{1}' -f ($_.BaseName -replace '\.', '_'), $_.Extension
}
最終重命名file.1.tar.gz為file_1_tar.gz,而我想要file_1.tar.gz.
只是疏忽?或者可以減輕嗎?
uj5u.com熱心網友回復:
這是預期的行為。
這是 Microsoft Doc 的引述。關于該[System.IO.Path]::GetExtension方法,它似乎與其他類似功能和 Powershell Cmdlet 共享相同的實作邏輯。
此方法通過在路徑中搜索句點 (.) 來獲取路徑的擴展名,從路徑中的最后一個字符開始,一直到第一個字符。如果在 DirectorySeparatorChar 或 AltDirectorySeparatorChar 字符之前找到句點,則回傳的字串包含句點及其后的字符;否則,回傳 String.Empty。
您當然可以通過使用字典為 tar.gz 和其他雙重擴展創建例外來定義應該被視為雙重例外的內容來緩解這種情況。這是緩解的示例。
Get-ChildItem -Path 'C:\temp' | % {
$BaseName = $_.BaseName
$Extension = $_.Extension
if ($_.FullName.EndsWith('.tar.gz')) {
$BaseName = $_.BaseName.SubString(0,$_.BaseName.Length -4)
# I used the full name as reference to preserve the case on the filenames
$Extension = $_.FullName.Substring($_.FullName.Length - 7)
}
Rename-Item -Path $_.FullName -NewName (
'{0}{1}' -f ($BaseName -replace '.', '_'), $Extension
)
}
請注意,由于我只有.tar.gz, 我實際上并沒有使用字典,但是如果您有多個雙擴展型別,最好的方法是通過對每個擴展的回圈應用此方法以查看它是否匹配。
以此為例,它回圈遍歷一個陣列以檢查多個雙擴展名
# Outside of the main loop to avoid redeclaring each time.
$DoubleExtensionDict = @('.tar.gz', '.abc.def')
Get-ChildItem -Path 'C:\temp' | % {
$BaseName = $_.BaseName
$Extension = $_.Extension
Foreach ($ext in $DoubleExtensionDict) {
if ($_.FullName.EndsWith($ext)) {
$FirstExtLength = ($ext.split('.')[1]).Length
$BaseName = $_.BaseName.SubString(0, $_.BaseName.Length - $FirstExtLength -1)
$Extension = $_.FullName.Substring($_.FullName.Length - 7)
break
}
}
Rename-Item -Path $_.FullName -NewName (
'{0}{1}' -f ($BaseName -replace '.', '_'), $Extension
)
}
參考
Path.GetExtension 方法
uj5u.com熱心網友回復:
正如Sage Pourpre 的有用答案所指出的那樣,按照設計,只有最后一個 .分隔的標記被視為檔案擴展名。
除了創建已知“多擴展”的哈希表(字典)之外,正如 Sage 所建議的那樣 - 這將不得不預測所有這些 -您可以嘗試基于以下規則的啟發式(因為您需要排除考慮.1部分多擴展):
- 任何不以 digit 開頭的非空
.分隔標記,在檔案名的末尾,都被認為是多擴展名,包括字符:.
@{ Name = 'file.1.tar.gz'},
@{ Name = 'file.1.tar.zip'},
@{ Name = 'file.1.html'},
@{ Name = 'file.1.ps1'},
@{ Name = 'other.1'} |
ForEach-Object {
if ($_.Name -match '(. ?)((?:\.[^\d] ))$') {
$basename = $Matches[1]
$exts = $Matches[2]
} else {
$basename = $_.Name
$exts = ''
}
($basename -replace '\.', '_') $exts
}
以上產生:
file_1.tar.gz
file_1.tar.zip
file_1.html
file_1.ps1
other_1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/384956.html
