Renamer.ahk
いろいろ付け足していったらごちゃごちゃになったので見なおして再投稿
大抵のリネームソフトについてるF2でフォーカスが変わる機能は便利なんだけど
それすらも面倒になったため、ファイル名後にドットを打てばファイル名のみを
ドットを打った後に拡張子を書けば拡張子だけを変えるようなモノを書いた
これだけだと寂しいので以下を追加、それらのメモ
?は、元のファイル名から拡張子を除いた文字列と同じ位置の文字
*は、元のファイル名から拡張子を除いた文字列
\は、Edit3に記入した数字からの連番。それ以降すべてのファイルに処理
:a:は、元のファイル名から拡張子を除いた文字列の、位置aの文字。$はファイル名の最後を表す
:a,b:は、元のファイル名から拡張子を除いた文字列の、位置aから位置bまで抜き出した文字列。$はファイル名の最後を表す
で囲むとその部分を大文字化 | |||
で囲むとその部分を小文字化 |
チェックボックスのAllはそれ以降全てのファイルに同じ処理をさせる
変更する前にリストボックスで確認できるようにした
単体起動とD&Dをできるようにした
次と前のファイルへ移動できるようにボタンを追加
昇順で並び替えるソートボタンを追加
サブフォルダを読み込むチェックボックスを追加
;; foobar.ini ; . → foobar.ini ; baz. → baz.ini ; .txt → foobar.txt ; * → foobar ; baz*. → bazfoobar.ini ; ???baz. → foobaz.ini ; baz????. → bazbar.ini ; |?|??. → Foo.ini ; :1,$-3:. → foo.ini ;<foo,bar><bar,baz>. → bazbaz.ini ;|*|baz<foo,bar><bar,baz>. → BAZBAZbaz.ini ; foo.ini bar.txt ; \ 001 → 001 002 ; \. 002 → 002.ini 003.txt ; \.ini 001 → 001.ini 002.ini ; ??\. 001 → fo001.ini ba002.txt ; *\. 001 → foo001.ini bar002.txt ; baz\. 001 → baz001.ini baz002.txt ;<foo|bar,baz\> 001 → baz001.ini baz002.txt ; All ; foo.ini bar.txt baz.log ; ?. →f.ini b.txt b.log ; |?|?. →Fo.ini Ba.txt Ba.log ; |?|:2,$: →Foo.ini Bar.txt Baz.log #NoEnv SetBatchLines, -1 ListLines, Off ;Option Poschr = ? Allchr = * Serialchr = \ Upper = | | Lower = || || StrMid = : : RegEx = < > SubDir = 1 ListBox = 1 GuiWeight = 500 ListHeight = 150 NextButton = 0 BackButton = 0 SortButton = 0 ;OptionExit Poschr := RegExReplace( Poschr, "([.*?+\[\]{}|()^$\\])", "\$1") Allchr := RegExReplace( Allchr, "([.*?+\[\]{}|()^$\\])", "\$1") Serialchr := RegExReplace( Serialchr, "([.*?+\[\]{}|()^$\\])", "\$1") RegExMatch( RegExReplace( Upper, "([.*?+\[\]{}|()^$\\])", "\$1"), "(.*)\s(.*)", Upper) RegExMatch( RegExReplace( Lower, "([.*?+\[\]{}|()^$\\])", "\$1"), "(.*)\s(.*)", Lower) RegExMatch( RegExReplace( StrMid, "([.*?+\[\]{}|()^$\\])", "\$1"), "(.*)\s(.*)", StrMid) RegExMatch( RegExReplace( RegEx, "([.*?+\[\]{}|()^$\\])", "\$1"), "(.*)\s(.*)", RegEx) FileCount += %0% Renamer( PathSet(FileCount)) PathSet(FileCount){ Loop % FileCount FilePaths .= %A_Index% "|" Return FilePaths } Renamer( FilePaths){ global SubDir, All, Serialchr, ListBox, GuiWeight, ListHeight, NextButton, BackButton, SortButton, FileCount static Drop, TempFilePaths, SubCount, Gui, InputStr, SerialNumber Sort, FilePaths, D`| U FileCount -= ErrorLevel + SubCount TempFilePaths := FilePaths FilePaths := RegExReplace( FilePaths, "\|$") If SubDir { SubCount := "0" Loop, Parse, FilePaths, `| Loop, %A_loopField%\*.*, 1, 1 { SubCount++ FilePaths .= "|" A_LoopFileFullPath } FileCount += SubCount } If Drop { Gui := True Pause, Off Exit } FileNumber := "1" Goto, Gui Gui: Gui := False Loop, Parse, FilePaths, `| FilePath := A_LoopField Until A_Index = FileNumber SplitPath, FilePath, FileName, Folder, Extension, NameNoExt Gui, Destroy Gui, Add, Edit, Disabled, %FileName% Gui, Add, Edit, w%GuiWeight% vInputStr, % RenameList ? InputStr : FileName Gui, Add, Edit, w50 vSerialNumber, % StartSerialNumber ? StartSerialNumber : "001" Gui, Add, Button, x200 y60 Default, OK Gui, Add, Button, x250 y60, Cancel IfEqual, NextButton, 1, Gui, Add, Button, x330 y60, &Next IfEqual, BackButton, 1, Gui, Add, Button, x390 y60, &Back IfEqual, SortButton, 1, Gui, Add, Button, x450 y60, &Sort Gui, Add, Checkbox, % All ? "x90 y65 vAll Checked " : "x90 y65 vAll", &All Gui, Add, Checkbox, % SubDir ? "gSubDir Checked" : "gSubDir", &SubDir IfEqual, ListBox, 1, Gui, Add, ListBox, x10 w%GuiWeight% h%ListHeight%, % RenameList ? RenameList : FilePaths Gui, Show,, % FilePath ? FileNumber "/" FileCount : "Renamer.ahk" VarSetCapacity( RenameList, 0) Pause, On SetFormat, FloatFast, % "0" StrLen( SerialNumber) ".0" Goto, % Gui ? "Gui" : OldInputStr = InputStr && StartSerialNumber = SerialNumber && All = States ? "FileMove" : ListBox ? "List" : "FileMove" GuiDropFiles: Drop := FilePaths ? True : False Gui, Submit, Nohide FileCount += A_EventInfo FilePaths := TempFilePaths RegExReplace( A_GuiEvent, "`n", "|") "|" Renamer( FilePaths) ButtonOK: Gui, Submit, Pause, Off Return List: OldInputStr := InputStr StartFileNumber := FileNumber StartSerialNumber := SerialNumber SerialNumber -= 1 Rename := ConvertStr( InputStr, Extension, NameNoExt) If RegExMatch( Rename, Serialchr) { All := True Rename := RegExReplace( Rename, Serialchr, SerialNumber += 1.0) } RenameList = %FilePath% → %Rename% If All { FileNumber++ Loop, Parse, FilePaths, `| If A_Index = % FileNumber { FileNumber++ SplitPath, A_LoopField, FileName,, Extension, NameNoExt Rename := ConvertStr( InputStr, Extension, NameNoExt) Rename := RegExReplace( Rename, Serialchr, SerialNumber += 1.0) RenameList = %RenameList%|%A_LoopField% → %Rename% } } FileNumber := StartFileNumber States := All Goto, Gui FileMove: SerialNumber -= 1 Rename := ConvertStr( InputStr, Extension, NameNoExt) If RegExMatch( Rename, Serialchr) { All := True Rename := RegExReplace( Rename, Serialchr, SerialNumber += 1.0) } FileMoveDir, %FilePath%, %Folder%\%Rename%, R FileMove, %FilePath%, %Folder%\%Rename% StringReplace, FilePaths, FilePaths, %FilePath%, %Folder%\%Rename%, All If All { FileNumber++ Loop, Parse, FilePaths, `| If A_Index = % FileNumber { FileNumber++ SplitPath, A_LoopField,, Folder, Extension, NameNoExt Rename := ConvertStr( InputStr, Extension, NameNoExt) Rename := RegExReplace( Rename, Serialchr, SerialNumber += 1.0) FileMoveDir, %A_LoopField%, %Folder%\%Rename%, R FileMove, %A_LoopField%, %Folder%\%Rename% StringReplace, FilePaths, FilePaths, %A_LoopField%, %Folder%\%Rename%, All } } If FileNumber >= % FileCount ExitApp FileNumber++ Goto, Gui ButtonCancel: ExitApp GuiEscape: ExitApp GuiClose: ExitApp SubDir: Gui, Destroy SubDir := !SubDir If SubDir { SubCount := "0" Loop, Parse, FilePaths, `| Loop, %A_loopField%\*.*, 1, 1 { SubCount++ FilePaths .= "|" A_LoopFileFullPath } FileCount += SubCount } If !SubDir { FilePaths := TempFilePaths FileCount -= SubCount SubCount := "0" } FilePaths := RegExReplace( FilePaths, "\|$") Gui := True Pause, Off Return ButtonNext: If FileNumber < % FileCount FileNumber++ Gui := True Pause, Off Return ButtonBack: If FileNumber > 1 FileNumber-- Gui := True Pause, Off Return ButtonSort: Sort, FilePaths, D`| Gui := True Pause, Off Return } ConvertStr( InputStr, Extension, NameNoExt){ global Poschr, Allchr, Upper1, Upper2, Lower1, Lower2, StrMid1, StrMid2, RegEx1, RegEx2 RegExReplace( RegExReplace( InputStr, StrMid1 ".*?" StrMid2,"", MidField), Upper1 ".*?" Upper2 "|" Lower1 ".*?" Lower2,"", ULField) OutputStr := RegExReplace( RegExReplace( RegExReplace( RegExReplace( InputStr, RegEx1 ".*?" RegEx2,"", RegExField) , "^\.(.*)$", NameNoExt . "." . "$1"), AllChr, NameNoExt), "^(.*)\.$", "$1" . "." . Extension) Loop % MidField { MidOption := RegExReplace( RegExReplace( OutputStr, ".*?" StrMid1 "(.*?)" StrMid2 ".*", "$1","", 1), "\$", StrLen( NameNoExt)) pos1 := RegExMatch( MidOption, "^(\d*?)\s*?-\s*?(\d*)\,?", pos1) ? pos11 - pos12 : RegExReplace( MidOption, "\,.*$") pos2 := RegExMatch( MidOption, "\,?(\d*?)\s*?-\s*?(\d*)$", pos2) ? pos21 - pos22 : RegExReplace( MidOption, "^.*\,") StringMid, MidStr, NameNoExt, %pos1%, % pos2 - pos1 + 1 OutputStr := RegExReplace( OutputStr, StrMid1 ".*?" StrMid2, MidStr,"", 1) } Loop, Parse, OutputStr, % RegExReplace( Poschr, "\\([.*?+\[\]{}|()^$\\])", "`$1") { RegExReplace( A_loopField, Upper1 "|" Upper2 "|" Lower1 "|" Lower2,"", ExStrCount) ExStr += ExStrCount StringMid, PoschrStr, NameNoExt, % RegExMatch( OutputStr, PosChr) - ExStr, 1 OutputStr := RegExReplace( OutputStr, PosChr, PoschrStr, "", 1) } Loop % RegExField { RegExMatch( InputStr, RegEx1 "(?P.*?)" RegEx2, RegEx) InputStr := RegExReplace( InputStr, RegEx1 "(.*?)" RegEx2,"","", 1) If !RegExMatch( RegExParam, "^\s*?(.*?[^\\]?)\,\s*?(.*?)\,\s*?(.*?)\,\s*?(.*?)$", Param) && !RegExMatch( RegExParam, "^\s*?(.*?[^\\]?)\,\s*?(.*?)\,\s*?(.*?)$", Param) && !RegExMatch( RegExParam, "^\s*?(.*?[^\\]?)\,\s*?(.*?)$", Param) RegExMatch( RegExParam, "^\s*?(.*)\s*?$", Param) OutPutStr := OutputStr ? RegExReplace( OutputStr, param1, param2,"", param3 ? param3 : "-1", param4 ? param4 : "1") : RegExReplace( NameNoExt "." Extension, param1, param2,"", param3 ? param3 : "-1", param4 ? param4 : "1") } Loop % ULField OutputStr := RegExReplace( RegExReplace( OutputStr, Lower1 "(.*?)" Lower2, "$L{1}", "", 1), Upper1 "(.*?)" Upper2, "$U{1}", "", 1) Return OutputStr }