(AutoHotkey)(複数のファイルマッチパターンにマッチするファイルの中から 一つ ランダムにファイルを選ぶ 編)

 あえて 二回走査する所が ミソかな? 笑)
[]; RandomFileSelect(FileMatchPatterns)    ファイルマッチパターンにマッチするファイルの中から 一つをランダムに選ぶ[]
[];                                        複数個の ファイルマッチパターンを指定する場合は 「改行区切り」で指定する[]
[]RandomFileSelect(FileMatchPatterns)[]
[]{[]
[]	Count := 0[]
[]	Loop, Parse, FileMatchPatterns, `n[]
[]	{[]
[]		If ( A_LoopField == "" )[]
[]			Break[]
[]		Loop, %A_LoopField%[]
[]			Count++[]
[]	}[]
[]	Random, RandomIndex, 1, %Count%[]
[]	Count := 0[]
[]	Loop, Parse, FileMatchPatterns, `n[]
[]	{[]
[]		Loop, %A_LoopField%[]
[]		{[]
[]			Count++[]
[]			If ( Count == RandomIndex )[]
[]				Return A_LoopFileLongPath[]
[]		}[]
[]	}[]
[]	Return ""[]
[]}[]
例えば、 マッチさせたいパターンが
[]d:\Data\Pictures\*.jpg[]
[]d:\Data\Pictures\*.jpeg[]
[]d:\Data\Pictures\*.bmp[]
[]e:\Data\Pictures\*.jpg[]
だったりしたら
Patterns := "d:\Data\Pictures\*.jpg`n"
Patterns .= "d:\Data\Pictures\*.jpeg`n"
Patterns .= "d:\Data\Pictures\*.bmp`n"
Patterns .= "e:\Data\Pictures\*.jpg"
MsgBox,% RandomFileSelect(Patterns)
こんな感じになります
もちろん パターン文字列は いちいち 複数行に分けて 書く必要も無いです
いきなり 文字列でぶっ続けて書いて 引数に ぶち込んでも ちゃんと 改行区切り( `nで区切られている) になってれば OKです
MsgBox,% RandomFileSelect("d:\Data\Pictures\*.jpg`nd:\Data\Pictures\*.jpeg`nd:\Data\Pictures\*.bmp`ne:\Data\Pictures\*.jpg")
ですね、 ただ 可読性を上げるには 区切って書いていったほうがいいかな?、 不慮の間違いも減りますしね
あと 最後の マッチパターンの行末には 改行コードは不要です、 まぁ付けてしまっても 誤動作はしないようには 一応考慮してます

 もちろん マッチパターンが複数個 必要無い時は
MsgBox,% RandomFileSelect("d:\Data\Pictures\*.jpg")
で OKです