客先にて、テストで取得したエビデンスを整理する為に作成してみた。
まさか勝手にリネームソフトを入れるわけにもいかず。
ソース
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で埋めてやりたい時は
num.ToString("000")```
こんな感じで埋めてやりたい桁数分の0をToStringメソッドの引数に渡してやって、文字列に変換する。
## ・リネーム対象ファイルの選択
リネーム対象のファイルのリストを作成する際、ファイルの属性でフィルターをかける。
ディレクトリ等の属性を持っているファイルを除外する。
```Where-Object {$_.Mode.Equals("-a---")}```
属性についての詳細は下記を参照
参考:http://www.atmarkit.co.jp/ait/articles/1409/26/news133.html
# 最後に
設定を設定ファイルから読み込むようにしたり、ファイル名の変更履歴を後から閲覧できるように出力したりと他にもできることはあるかと思いますが、一旦はこんなところで。
気軽にアドバイス等頂けると喜びます。
ここまでお読みいただきましてありがとうございました。:)