我有一个脚本,用于清理文件名,以匹配我喜欢的样式/格式。它的工作原理,但它有点丑陋,并做了一个循环的每一个变化。理想情况下,它会同时处理每个文件名的所有更改,然后继续到下一个文件名,而不是每次抓取gci。
有什么建议可以让这件事变得更加优雅/精简吗?谢谢!
#need this for camel casing later
$Culture = Get-Culture
#Remove Other Tags
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('(retail)','') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('(epub)','') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('(mobi)','') }
#Pad Dashes
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('-',' - ') }
#Replace Underscores with Spaces
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('_',' ') }
#Replace dots with space except for in the extension
Get-ChildItem -Recurse | Rename-Item -NewName { ($_.BaseName -replace '\.',' ') + $_.Extension }
#Rename to Camel Casecd
Get-ChildItem -recurse | Rename-Item -NewName {$Culture.textinfo.totitlecase($_.FullName)}
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace(' .','.') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('.Epub','.epub') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('.Pdf','.pdf') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('.Mp3','.mp3') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('For','for') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('And','and') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('In','in') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('On','on') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('Of','of') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('From','from') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('To','to') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace(' A ',' a ') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace(' i',' I') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('epubo O','epub') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('Html','HTML') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('Css','CSS') }
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace('Css','CSS') }
#Remove Double Spaces
Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name.Replace(' ',' ') }
发布于 2022-08-17 09:21:11
我知道可能尚未完成,但这可能是进一步改善的灵感;)
Get-ChildItem -Recurse -Directory |
ForEach-Object {
$NewBaseName = $_.BaseName -replace '\(epub\)' -replace '\(mobi\)' -replace '\(retail\)'
$NewBaseName = $NewBaseName -replace '-', ' - ' -replace '_', ' ' -replace '\.', ' ' -replace '\s+', ' '
$NewBaseName = $NewBaseName.toLower() -replace 'epubo O', 'epub' -creplace 'html', 'HTML' -creplace 'css', 'CSS'
$NewExtension = $_.Extension.toLower()
$NewName = Join-Path -Path $_.Directory -ChildPath ($NewBaseName + $NewExtension)
Rename-Item -Path $_.FullName -NewName $NewName
}
这样,您只遍历目录一次。这至少比你的方法要快。
发布于 2022-08-17 07:23:19
这里有一个建议,如果你认为它是优雅的:
$hash = @{'(retail)' = ''; '(epub)' = ''; '(mobi)' = ''; 'And' = 'and' } #To be completed
$Culture = Get-Culture
$items = Get-ChildItem -Recurse
foreach ($item in $items) {
$name = $item.Name
foreach ($h in $hash.Keys) {
$name = $name.Replace($h, $hash.$h)
}
Rename-Item -Path $item.FullName -NewName $name
}
https://stackoverflow.com/questions/73383251
复制相似问题