ファイル名: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
}
}
}
}
コメント