PowerShell 批量替换特定字符并重命名文件扩展名

PowerShell bulk replacing a specific character and rename file extension

我需要批量重命名文件共享中的文件

  1. 包含特定字符,即波浪号 ~
  2. 文件扩展名全部为大写字母或none。

目标是用简单的 - 替换波浪号,保留文件扩展名(如果有),但将其转换为小写字母。

我已成功找到文件的脚本的第一部分

$PATH = "\<Fileservername>\<Folder>\"
$pattern = "*~*"
Get-ChildItem $PATH -Recurse | where {$_.Name -like $pattern}

我正在努力解决的是重命名脚本的第二部分。 我在这里找到了两个主题:

我无法根据我的需要调整这些解决方案,而且可能需要采取额外的步骤才能将给定的文件名从大写字母转换为小写字母,或者如果文件没有文件扩展名则跳过此步骤.

例如,将 ACUJLH~H 重命名为 ACUJLH-H,将 KYA3BM~Q.PDF 重命名为 KYA3BM-Q.pdf

您需要过滤符合您条件的文件。然后使用 ForEach-Object 比较扩展名并为每个找到的项目构建新文件名。最后,使用 Rename-Item cmdlet 进行更改。

$PATH = '\<Fileservername>\<Folder>\'    
Get-ChildItem $PATH -Recurse -Include '*~*' | ForEach-Object {
        [String]$Extension = [System.IO.Path]::GetExtension($_)
        [String]$NewFileName = [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -replace '~','-'
        if ($Extension){ $NewFileName += $Extension.ToLower() }
        Rename-Item $_.FullName $(Join-Path ([System.IO.Path]::GetDirectoryName($_)) $NewFileName) -Force
    }

这是我的贡献。我已将 -File 开关添加到 Get-ChildItem cmdlet,因此它只会查找文件,不会尝试处理目录名称。 此外,我已将替换模式更改为 ~+,因此具有重复波浪号的文件将被替换为单个 - 字符。 (KYA3BM~~~~Q.PDF 变为 KYA3BM-Q.pdf)

$path = "D:\Code\PowerShell\Whosebug"
$pattern = "*~*"
Get-ChildItem $path -Recurse -File | Where-Object {$_.Name -like $pattern} |
    ForEach-Object {
        $directory = $_.DirectoryName                # or [System.IO.Path]::GetDirectoryName($_.FullName)  or use Split-Path $_.FullName -Parent
        $filename  = $_.BaseName -replace '~+', '-'  # or [System.IO.Path]::GetFileNameWithoutExtension($_.Name) -replace '~+', '-'
        $extension = $_.Extension                    # or [System.IO.Path]::GetExtension($_.Name)
        if (![string]::IsNullOrEmpty($extension)) { $filename += $extension.ToLower() }
        $newname = Join-Path -Path $directory -ChildPath $filename
        Rename-Item -LiteralPath $_.FullName -NewName $newName -Force
    }