QA@IT

batを使ったリネーム

573 PV

aaa_bbb_ccc.txtがあったとします。
これをaaa_Bbb_Ccc.txtと_の1文字後ろの文字を大文字にしたいのですがやり方が分かりません。

ifでファイル名から_を探しあった数だけfor分で1文字となりを置換すればいいのかなと思うのですが何分bat初心者のためご教授願います。

  • batファイルでないとダメなのでしょうか?
    文字列置換を行うのは結構大変だと思います。
    -
  • bat以外でも大丈夫なのです
    -

回答

VBSを使った方法です。
fs.GetFolderの部分を適切なフォルダーにするとよいかと思います。

Dim fs
Dim folder
Dim files
Dim OldName
Dim NewName

set fs = CreateObject("Scripting.FileSystemObject")
set folder = fs.GetFolder("D:\work")
set files = folder.Files
For Each file in files
    OldName =file.Name
    NewName = TransFileName(OldName)
    if OldName <> NewName then
        file.Move file.ParentFolder & "\" & NewName 
    end if
Next

Function TransFileName(OldName)
    Dim NewName
    Dim NameParts
    Dim UBParts
    Dim Idx
    Dim tmp 

    NameParts = Split(OldName,"_")
    UBParts =UBound(NameParts)

    If UBParts <= 0 Then
        NewName =OldName
    Else
        NewName = NameParts(0)
        For Idx = 1 To UBParts
           NewName = NewName & "_"
           tmp = NameParts(Idx)
           If Len(tmp)<2 Then
               NewName = NewName & tmp
           Else
               NewName = NewName & UCase(Mid(tmp, 1, 1)) & Mid(tmp, 2)
           End If
        Next
    End If

    TransFileName = NewName
End Function

編集 履歴 (0)
  • ありがとうございます。
    vbsでもできるんですね
    なにぶんこういうプログラム言語は初めてなので大変助かります
    -

PowerShellでよければ、こんな感じでいかがでしょうか。

$ary_names = "aaa_bbb_ccc.txt"

$idx = -1
$counter = 0

while($TRUE){
    $idx = $ary_names.IndexOf( '_', $idx + 1)

    if($idx -ne -1){
        $counter ++
        $tmp = $ary_names.Substring($idx+1, 1).ToUpper()
        $ary_names = $ary_names.Remove($idx+1,1)
        $ary_names = $ary_names.Insert($idx+1,$tmp)
    }else{
        break
    }
}
write-host $ary_names
編集 履歴 (0)
  • おぉ〜
    ありがとうございます

    PowerShellなるものがあるんですね
    勉強したいのですが何かいい教本などありますでしょうか
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。