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

时间:2018-10-05 08:46:27

标签: powershell file-rename bulk batch-rename

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

  1. 包含特定字符,即波浪号~
  2. 文件扩展名为大写字母或根本没有。

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

我在查找文件的脚本的第一部分中取得了成功

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

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

我无法适应这些解决方案,另外可能需要采取其他步骤,才能将给定的文件名从大写字母转换为小写字母,如果文件没有文件扩展名,则跳过此操作。< / p>

一个示例是将ACUJLH~H重命名为ACUJLH-H,将KYA3BM~Q.PDF重命名为KYA3BM-Q.pdf

2 个答案:

答案 0 :(得分:2)

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

$path = "D:\Code\PowerShell\StackOverflow"
$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
    }

答案 1 :(得分:0)

您将需要过滤符合条件的文件。然后使用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
    }