PowerShellで正規表現でファイル名を変更するスクリプト

powershell7 コンピュータ
powershell7

ファイル名:RenameFile-Regexp.ps1

<#
.SYNOPSIS
正規表現でファイル名を変更

.EXAMPLE
ls | .RenameFile-Regexp.ps1 -Pattern "\(.+?\)" -Replace "" -WhaiIf

.INPUTS
FileInfo[]

.INPUTS
string[]

.OUTPUTS
なし

.PARAMETER TargetFile
対象ファイル

.PARAMETER Pattern
正規表現パターン

.PARAMETER Replace
置き換え文字

.PARAMETER WhatIf
問い合わせ

.PARAMETER Help
ヘルプ

#>
param(
    [string]
    $TargetFile,
    [string]
    $Pattern = "\(.+?\)",
    [string]
    $Replace = "",
    [switch]
    $WhatIf,
    [switch]
    $Help
)

function MyRegExpRename {
    param (
        [string]
        $srcFile
    )
    Write-Host $srcFile

    $parent = Split-Path $srcFile -Parent
    $leaf = Split-Path $srcFile -Leaf
    $base = Split-Path $srcFile -LeafBase
    $ext = Split-Path $srcFile -Extension

    $result = [Regex]::Replace($base, $Pattern, $Replace)
    if ($result -eq $base) {
        return
    }

    $n = 0
    $fileName = $result + $ext
    while(Test-Path -LiteralPath (Join-Path $parent $fileName)) {
        $fileName = ("{0}_{1}{2}" -f $result, ++$n, $ext)
    }

    $destination = Join-Path $parent $fileName

    if ($WhatIf) {
        $in = Read-Host ("{0}を{1}へ変更しますか? y or n" -f $leaf, $fileName)
        if ($in.ToLower() -ne "y") {
            return
        }
    }

    Move-Item -LiteralPath $srcFile -Destination $destination
}

$args = @($input)
if ($Help -Or ($args.Count -eq 0) -And ($TargetFile -eq "")) {
    Get-Help $PSCommandPath
    Exit 1
}

# 単一ファイル
if (Test-Path $TargetFile) {
    MyRegExpRename $TargetFile
    Exit 0
}

# パイプライン
if ($args.Count -gt 0) {
    $args | ForEach-Object {
        $f = $_
        $type = $_.GetType()
        switch ($type.Name) {
            'String' {
                if (Test-Path $f) {
                    MyRegExpRename $f
                }
            }
            'FileInfo' {
                MyRegExpRename $f.FullName
            }
        }
    }
}

コメント