【问题标题】:Powershell Script to clean up file names用于清理文件名的 Powershell 脚本
【发布时间】:2022-08-22 15:47:28
【问题描述】:

我有一个脚本,用于清理文件名以匹配我喜欢的样式/格式。它按原样工作,但有点难看,并且每次更改都会循环。理想情况下,它会一次处理每个文件名的所有更改,然后继续下一个,而不是每次都抓取 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(\'  \',\' \') }
  • 我认为您的代码的问题在于您查询相同的文件列表 25 次。我建议查询它们一次,对它们的名称进行所有更改,然后重命名它们......只有一次。 ;-)

标签: windows powershell filesystems


【解决方案1】:

如果您认为它很优雅,这里有一个建议:

$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
}

【讨论】:

    【解决方案2】:

    我知道它可能不完整,但它可能是进一步改进的灵感;-)

    Get-ChildItem -Recurse | 
    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
    }
    

    这样,您只需遍历目录一次。这至少应该比你的方法更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      相关资源
      最近更新 更多