Renamer.ahk

いろいろ付け足していったらごちゃごちゃになったので見なおして再投稿


大抵のリネームソフトについてるF2でフォーカスが変わる機能は便利なんだけど
それすらも面倒になったため、ファイル名後にドットを打てばファイル名のみを
ドットを打った後に拡張子を書けば拡張子だけを変えるようなモノを書いた
これだけだと寂しいので以下を追加、それらのメモ


?は、元のファイル名から拡張子を除いた文字列と同じ位置の文字
*は、元のファイル名から拡張子を除いた文字列
\は、Edit3に記入した数字からの連番。それ以降すべてのファイルに処理
:a:は、元のファイル名から拡張子を除いた文字列の、位置aの文字。$はファイル名の最後を表す
:a,b:は、元のファイル名から拡張子を除いた文字列の、位置aから位置bまで抜き出した文字列。$はファイル名の最後を表す

で囲むとその部分を大文字化
で囲むとその部分を小文字化

Autohotkey正規表現置換
チェックボックスの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
}