LoginSignup
1
3

More than 5 years have passed since last update.

PowerShellでファイル名を連番でRenameする

Last updated at Posted at 2017-06-24

客先にて、テストで取得したエビデンスを整理する為に作成してみた。
まさか勝手にリネームソフトを入れるわけにもいかず。

ソース

renameFiles.ps1
####################################################################################
# renameFilesメソッド
# 作業フォルダ内にあるファイル名を指定した名称にリネームする
####################################################################################
function renameFiles ([string] workPath){
    if($workPath.EndsWith("¥") -ne $true){$workPath+="¥"}

    try{
        Set-Location $workPath
    } catch [Exception]{
        Write-Host "設定したパスは存在しません。正しいパスを設定してください。"
        break
    }

    $fileName = Read-Host "変更後のファイル名を入力してください。"
    try{
        [int] $num = Read-Host "振り直す番号の開始位置を入力してください。"
        [int] $size = Read-Host "振り直す番号の桁数を入力してください。"
    } catch [Exception] {
        Write-Host "開始番号と桁数には数字を設定してください。"
        break
    }

    # 入力した数字から桁番号のフォーマット文字列作成
    $format = $null;
    for($i=0; $i -lt $size; $i++){$format += "0"}

    $fileType = "-a---"
    [string[]]$fileList = Get-ChildItem $path |
    # ディレクトリや読み取り専用等のファイルは除外
    Where-Object {$_.Mode.Equals($fileType)} |
    Sort-Object {$_.LastWriteTime}

    foreach($f in $fileList){
        $newName = ($fileName + "_" + $num.ToString($format))
        if($f.Contains(".")){
            $extension = $f.Substring($f.LastIndexOf("."))
            $newName += $extension
        }
        Rename-Item ($workPath + $f) -NewName $newName
        $num++
    }
}
####################################################################################

####################################################################################
# Main
####################################################################################
$ErrorActionPreference = "stop"
[string] $workPath =  Split-Path(Split-Path $myInvocation.MyCommand.path -Parent) -Parent

do{
    renameFiles $workPath
    do{
        $command = Read-Host "処理を継続しますか?y/n"
    }while(($command -ne "y") -And ($command -ne "n"))
}
while($command -eq "y")
####################################################################################

作成時のポイント

・相対パス

例えばこんな感じなのを
$workPath = "c¥Users¥user¥work¥"

こんな感じにスクリプトの配置場所からパスを取得するように変更。
[string] $workPath = Split-Path $myInvocation.MyCommand.path -Parent)

さらに上記だとスクリプトファイルもリネームの対象になってしまう為、もう一個上のディレクトリを作業フォルダにするように変更
[string] $workPath = Split-Path(Split-Path $myInvocation.MyCommand.path -Parent)) -Parent

なんかすごくカッコ悪いけど、他に思いつかなかった。。。

・0で連番の桁埋め

[int] num = 5
これをそのまま出力すると「5」が出力される。

これを例えば、005という風に3桁になるように0で埋めてやりたい時は
[int] num = 5
num.ToString("000")

こんな感じで埋めてやりたい桁数分の0をToStringメソッドの引数に渡してやって、文字列に変換する。

・リネーム対象ファイルの選択

リネーム対象のファイルのリストを作成する際、ファイルの属性でフィルターをかける。
ディレクトリ等の属性を持っているファイルを除外する。
Where-Object {$_.Mode.Equals("-a---")}

属性についての詳細は下記を参照
参考:http://www.atmarkit.co.jp/ait/articles/1409/26/news133.html

最後に

設定を設定ファイルから読み込むようにしたり、ファイル名の変更履歴を後から閲覧できるように出力したりと他にもできることはあるかと思いますが、一旦はこんなところで。
気軽にアドバイス等頂けると喜びます。

ここまでお読みいただきましてありがとうございました。:)

1
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3