1 (изменено: Krot66, 2015-06-15 15:28:37)

Тема: AHK: Два скрипта для просмотрщика графики JPEGView

I. В основном решает вопросы нормального, не утомляющего глаза отображения названий, улучшенной навигации и слайдшоу, расширенного использования мыши и поиска информации о файле.

В полноэкранном режиме скрипт выводит в нижней части экрана тонкое, настраиваемое и не скрывающее изображение окно с именем файла, тремя текстовыми кнопками и текущим временем (включается и выключается по Ctrl+Space или правым кликом внизу экрана). Нажатие средней кнопкой мыши внизу экрана делает панель двухстрочной, что может быть полезно при длинных названиях.

http://savepic.su/5748957.jpg

Здесь:
Exif - окно вывода метаданных файла. Поддерживается открытие данных геолокации в Google Maps, Google Earth и SAS.Planet. Необходимо скачать Windows-версию ExifTool  на http://www.sno.phy.queensu.ca/~phil/exiftool/ , распаковать в папку программы и переименовать файл в exiftool.exe. ExifTool не понимает юникодные символы в имени файла!
Google - поиск в Google по имени файла без расширения.
TinEye - поиск похожих изображений с TinEye (загружает сайт и выводит вверху экрана подсказу с предложением нажать кнопку выбора файла - после нажатия скрипт вставляет путь к файлу и отправляет запрос).
Нажатие на часы отправляет имя файла в Google Translate.
Нажатие на имя файла скрывает или показывает дополнительные кнопки, освобождая место для длинных имен файлов.

В полноэкранном режиме можно перематывать кадры с помощью кнопок мыши при нахождении курсора у левого или правого края экрана. (Возможна перемотка при удержании кнопок, скрость определяется параметром MinimalDisplayTime в JPEGView.ini). Cтроку "MouseDblClk  IDM_EXIT" в KeyMap.ini лучше закоментировать или удалить, чтобы случайно не закрывалось окно программы.

Щелчок средней кнопки мыши у левого края экрана в полноэкранном режиме запускает слайдшоу в прямом направлении, у правого - в обратном, при этом колесиком  у края регулируется его скорость (текущая задержка отображается тултипом). Еще один щелчок средней кнопкой у края, выход из полноэкранного режима или Escape останавливают слайдшоу.

По Ctrl+O, Alt+Up или Alt+Down выводит увеличенное окно эксплорера c подсветкой текущего файла. Возможно быстрое и удобное перемещение по папкам с Alt+Up,Left,Right и Backspace. Средняя кнопка мыши в этом окне дает подъем на один уровень вверх.

Правый клик у верхнего края экрана включает и выключает отображение имени файла вверху окна, средний - работает как Ctrl+O

#NoEnv 
SetWorkingDir %A_ScriptDir%
#SingleInstance, force
Menu Tray, Icon, shell32.dll, 42
SetKeyDelay 50, 50
SetBatchLines, -1
CoordMode ToolTip
CoordMode Mouse

/*
В основном решает вопросы нормального, не утомляющего глаза отображения названий, улучшенной навигации и слайдшоу, расширенного использования мыши и поиска информации о файле.

В полноэкранном режиме скрипт выводит в нижней части экрана тонкое, настраиваемое и не скрывающее изображение окно с именем файла, тремя текстовыми кнопками и текущим временем (включается и выключается по Ctrl+Space или правым кликом внизу экрана). Нажатие средней кнопкой мыши внизу экрана делает панель двухстрочной, что может быть полезно при длинных названиях.

Здесь:
Exif - окно вывода метаданных файла. Поддерживается открытие данных геолокации в Google Maps, Google Earth и SAS.Planet. Необходимо скачать Windows-версию ExifTool  на http://www.sno.phy.queensu.ca/~phil/exiftool/ , распаковать в папку программы и переименовать файл в exiftool.exe. ExifTool не понимает юникодные символы в имени файла!
Google - поиск в Google по имени файла без расширения.
TinEye - поиск похожих изображений с TinEye (загружает сайт и выводит вверху экрана подсказу с предложением нажать кнопку выбора файла - после нажатия скрипт вставляет путь к файлу и отправляет запрос).
Нажатие на часы отправляет имя файла в Google Translate.
Нажатие на имя файла скрывает или показывает дополнительные кнопки, освобождая место для длинных имен файлов. Если этого мало, щелчком средней кнопки мыши внизу экрана можно сделать панель двустрочной.

В полноэкранном режиме можно перематывать кадры с помощью кнопок мыши при нахождении курсора у левого или правого края экрана. (Возможна перемотка при удержании кнопок, скрость определяется параметром MinimalDisplayTime в JPEGView.ini). Cтроку "MouseDblClk  IDM_EXIT" в KeyMap.ini лучше закоментировать или удалить, чтобы случайно не закрывалось окно программы.

Щелчок средней кнопки мыши у левого края экрана в полноэкранном режиме запускает слайдшоу в прямом направлении, у правого - в обратном, при этом колесиком  у края регулируется его скорость (текущая задержка отображается тултипом). Еще один щелчок средней кнопкой у края, выход из полноэкранного режима или Escape останавливают слайдшоу.

По Ctrl+O, Alt+Up или Alt+Down выводит увеличенное окно эксплорера c подсветкой текущего файла. Возможно быстрое и удобное перемещение по папкам с Alt+Up,Left,Right и Backspace. Средняя кнопка мыши в этом окне дает подъем на один уровень вверх.

Правый клик у верхнего края экрана включает и выключает отображение имени файла вверху окна, средний - работает как Ctrl+O
*/

;------ Настройки --------
panel:=1 ; 1 - включение нижней панели в полноэкранном режиме по умолчанию
double:=0 ; 1 - двустрочная панель по умолчанию
b_color:="292929" ; цвет панели
f_size:=13 ; размер шрифта панели
t_color:="53A600" ; цвет шрифта
marg:=2 ; поля текста
button_width:=120 ; ширина текстовых кнопок
delay:=3 ; стартовая задержка при слайдшоу, с
exif_tags:="File Name,Directory,File Size,File Modification Date/Time,File Creation Date/Time,File Permissions,File Type,|,Image Size,Megapixels,Encoding Process,Color Space,Bits Per Sample,Color Components,Camera Model Name,Orientation,ISO,Exposure Time,X Resolution,Y Resolution,Software,Location,Creator Work URL,Image Description,Warning" ; тэги EXIF, отображаемые при кратком варианте просмотра, через запятую (скопировать нужные из полного; порядок учитывается,"|" - пустая строка)
googleearth:="D:\Soft\GoogleEarthPortable\GoogleEarthProPortable.exe" ; путь к Google Earth для открытия данных GPS
sasplanet:="D:\Soft\SASPlanet\SASPlanet.exe" ; то же для SAS.Planet

goto start
;------ Горячие клавиши --------
#If WinActive("ahk_id " id)
^Space::panel:=!panel ; Ctrl+Space - включение/выключение нижней панели
+Space::double:=!double, upd:=1 ; Shift+Space - включение/выключение двустрочности
^vkE2::goto FileName ; Ctrl+| - скрытие/включение кнопок панели 
!Up::goto ^vk4F ; Alt+Up - открытие увеличенной панели проводника
!Down::goto ^vk4F ; Alt+Down - то же
^vk45::goto Exif ; Ctrl+E - окно Exif
^vk46::goto Search ; Ctrl+F - поиск по имени файла в Google
^vk54::goto TinEye ; Ctrl+T - поиск похожих изображений в TinEye
^vk47::goto Translate ; Ctrl+G - перевод названия с Google Translate
NumpadIns::Send {F11} ; Серый Ins - полноэкранный/оконный режим
#If WinActive("ahk_id " id) && !IsBorder(1,1,1,1)
MButton:: ; Средняя кнопка мыши - полноэкранный/оконный режим
MouseGetPos, , , mt
If (mt=id)
    Send {F11}
return
#IfWinActive

start:
n:=0, slideshow:=0, show_full:=0
SetFormat float, 2.1
SysGet, M, Monitor
Loop
{
    If !id0:=WinExist("ahk_exe JPEGView.exe")
    {
        n:=0
        Gui Destroy
        WinShow, ahk_class Shell_TrayWnd
        continue
    }
    n+=1 
    If (n=1)
        id:=id0        
    If IsFullScreen("ahk_id " id) && panel
    {        
        If !WinExist("bottom_window") || upd
        {
            panel_width:=MRight
            If !show_full
                panel_width-=button_width*4+marg*8        
            str:=double+1, upd:=""
            Gui Destroy
            Gui font, Arial bold s%f_size% c%t_color%
            Gui Margin, % marg*8, % marg                        
            Gui -Caption +ToolWindow -DPIScale +AlwaysOnTop +LastFound
            Gui Color, % b_color
            Gui, Add, Text, R%str% w%panel_width% gFileName
            Gui, Add, Text, x+0 w%button_width% R%str% Center gExif, Exif
            Gui, Add, Text, x+0 wp R%str% Center gSearch, Google
            Gui, Add, Text, x+0 wp R%str% Center gTinEye, TinEye
            Gui, Add, Text, x+0 wp R%str% Center gTranslate
            Gui Show, % "x" 0 "y" MBottom-50 "NA", bottom_window
        }                
        else
        {    
            WinGetPos, , , , hwin, bottom_window
            WinMove bottom_window , , , MBottom-hwin
            WinMove % "ahk_id " id, , , , , MBottom-hwin
            WinHide, ahk_class Shell_TrayWnd
            WinGetTitle t,% "ahk_id " id            
            RegExMatch(t,"i).+(\.[a-z]{2,4}|/\d+])",t_curr)
            ControlGetText t_old, Static1, bottom_window
            If (t_curr!=t_old)
            {
                ControlSetText Static1, % t_curr, bottom_window
                t_old:=t_curr
            }
            FormatTime time, ,HH:mm
            ControlSetText Static5, % time, bottom_window
        }            
    }
    else If !(WinExist("ahk_class #32768") || WinActive("ahk_id " id2) || WinActive("ahk_exe Autohotkey.exe"))
    {
        If slideshow
        {
            slideshow:=0
            ToolTip Slideshow off
            SetTimer, RemoveToolTip, 1000
        }            
        Gui Destroy
        WinShow, ahk_class Shell_TrayWnd
        If IsFullScreen("ahk_id " id)
            WinMove % "ahk_id " id, , , , , MBottom
    }
    If slideshow
    {
        Sleep delay*1000
        Send {%key%}
    }
    else
        Sleep 10
}

#If IsFullScreen("ahk_id " id) && IsBorder(0,0,1)
RButton::Send ^{F2}
MButton::goto ^vk4F

#If WinActive("ahk_id " id2)
MButton::Bs

#If IsFullScreen("ahk_id " id) && IsBorder(0,0,0,1)
RButton::panel:=!panel
MButton::double:=!double, upd:=1

#If IsFullScreen("ahk_id " id) && IsBorder(1,1)
LButton::
While GetKeyState("LButton","P")
{
    Send {PGDN}        
    If (A_Index=1)
        Sleep 250
    Sleep 10
    
}
return
RButton::
While GetKeyState("RButton","P")
{
    Send {PGUP}    
    If (A_Index=1)
        Sleep 250
    Sleep 10
    
}
return
MButton::
Thread Priority, 1
slideshow:=!slideshow
If slideshow
{
    key:="PGDN", direct:=">>>"
    If IsBorder(,1)
        key:="PGUP", direct:="<<<"
    ttip:="Slideshow`n" direct "`nDelay " delay " c"
}
else
    ttip:="Slideshow off"
ToolTip % ttip
SetTimer, RemoveToolTip, 1000
return
#If IsFullScreen("ahk_id " id) && IsBorder(1,1) && slideshow
WheelUp::
delay+=0.5
ToolTip % "Delay `n" delay " c"
SetTimer, RemoveToolTip, 1000    
return
WheelDown::
If (delay>=1)
    delay-=0.5
ToolTip % "Delay `n" delay " c"
SetTimer, RemoveToolTip, 1000    
return

RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
return

#If WinActive("ahk_id " id) && slideshow
Escape::slideshow:=0

#If WinActive("ahk_id " id)
^vk4F::
Send ^{vk4F}
WinWaitNotActive % "ahk_id " id, , 3
WinGet id2, ID, A
WinMove A , , MRight//20, MBottom//20, MRight*0.9, MBottom*0.9
ControlGetText tt, Edit1, % "ahk_id " id2
ControlFocus SysListView321, % "ahk_id " id2
Send ^+{2}
SendInput % tt
return
#IfWinActive

FileName:
Gui Destroy
show_full:=!show_full, upd:=1
return

Translate:
translate:="www.translate.google.com/#auto|ru|%s"
StringReplace url, translate, `%s, % RegExReplace(t_curr,"\..+?$")
Run % url
return

Search:
search:="https://www.google.ru/search?client=opera&q=%s&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest&gws_rd=ssl"
StringReplace url, search, `%s, % RegExReplace(t_curr,"\..+?$")
Run % url
return

TinEye:
WinActivate ahk_exe JPEGView.exe
Send ^{vk43}
ClipWait 3
If Errorlevel
    return
Sleep 200
WinMinimize ahk_exe JPEGView.exe
Run https://www.tineye.com/
WinWaitNotActive % "ahk_id " id, 3
Sleep 1000
ToolTip Нажмите кнопку выбора файла, MRight//2-50, 0
WinWaitActive ahk_class #32770, , 20
ToolTip
If Errorlevel
    return    
ControlSetText Edit1, % Clipboard
ControlSend Edit1, {Enter}
return

Exif:
WinActivate ahk_exe JPEGView.exe
WinGet jpegview_path, ProcessPath, ahk_exe JPEGView.exe
SplitPath jpegview_path, , jpegview_dir
exif:=jpegview_dir "\exiftool.exe"
Send ^{vk43}
ClipWait 3
If Errorlevel
    return
SplitPath Clipboard, f_name, f_dir
FileDelete exif_out.*
exif_cmd="%exif%" -g -c `%.6f degrees -charset cp1251 "%Clipboard%" > "exif_out.txt"
RunWait %comspec% /c "%exif_cmd%", , Min 
exif_full:="", exif_short:="", gps:=""
FileRead exif_full, exif_out.txt
exif_full:=RegExReplace(exif_full,":\s*\R",": ---\r\n")
exif_full:=RegExReplace(exif_full,"m)^---","`r`n          ---")
RegExMatch(exif_full,"m)GPS Latitude\s*:\s*\K[\d.]+",gps_lat)
RegExMatch(exif_full,"m)GPS Longitude\s*:\s*\K[\d.]+",gps_lon)
Loop Parse, exif_tags, CSV
{
    field:=A_LoopField
    If (field="|")
        exif_short.="`r`n", break
    Loop Parse, exif_full, `r`n
    {
        If (RegExReplace(A_LoopField,"\s*:.+$")=field)
            exif_short.=A_LoopField "`r`n", break
    }
}            
Gui 2:Destroy
Gui 2:+ToolWindow -DPIScale +AlwaysOnTop
Gui 2:Margin, 4, 4
Gui 2:Color, 292929
Gui 2:Font, s13 bold c%t_color%, Arial
GUi 2:Add, Text, y+4 w498 h36 Center gShort, Short
Gui 2:Add, Text, x+0 yp hp Center, |
Gui 2:Add, Text, x+0 yp w498 hp Center gFull, Full
gui 2:Font, s14 bold, Courier New
Gui 2:Add, Edit, % "xs w1000 h" MBottom-200 " ReadOnly"
If gps_lat && gps_lon
{
    width:=1000
    If googleearth && sasplanet
        width:=333
    If (googleearth && !sasplanet) || (!googleearth && sasplanet)
        width:=500    
    Gui 2:Font, s13 bold, Arial    
    Gui 2:Add, Text, x0 w%width% h36 Center gGMaps, Google Maps
    If googleearth
        Gui 2:Add, Text, x+0 wp hp Center ggoogleearth, Google Earth
    If sasplanet
        Gui 2:Add, Text, x+0 wp hp Center gsasplanet, SAS.Planet
}
Gui 2:Show, Center, Exif
ControlSetText Edit1,% exif_short, Exif
FileDelete exif_out.*
return

2GuiEscape:
WinClose Exif
FileDelete exif_out.*
return

Short:
ControlSetText Edit1,% exif_short, Exif
return

Full:
ControlSetText Edit1,% exif_full, Exif
return

GMaps:
Sleep 200
WinClose Exif
Run % "https://www.google.com/maps/place/" gps_lat "," gps_lon
return

googleearth:
Sleep 200
WinClose Exif
FileAppend % "<?xml version=""1.0"" encoding=""UTF-8""?>`r`n<kml xmlns=""http://www.opengis.net/kml/2.2""> <Placemark>`r`n<name>" f_name "</name>`r`n<description>Folder: " f_dir "</description>`r`n<Point>`r`n<coordinates>" gps_lon "," gps_lat "</coordinates>`r`n</Point>`r`n</Placemark> </kml>", exif_out.kml, UTF-8
Run "%googleearth%" "%A_ScriptDir%\exif_out.kml"
return

sasplanet:
Sleep 200
WinClose Exif
Run "%sasplanet%" --zoom=15 --move=(%gps_lon%`,%gps_lat%)
return

IsBorder(left:="",right="",top="",bottom:="",m=20)
{
    SysGet, M, Monitor
    CoordMode Mouse
    MouseGetPos mx, my
    return If ((left && mx<m) || (right && mx>MRight-m) || (top && my<m) || (bottom && my>MBottom-m))    
}

IsFullScreen(title)
{
    WinGet st, Style, % title
    return If (!(st & 0x00010000) && !(st & 0x80000000) && (st & 0x10000000) && WinActive(title)) 
}

II. Скрипт предназначен для работы с пользовательскими командами JPEGView, синтаксис которых описан в JPEGView.ini. Отличие от простых команд (copy, move и пр.) в автоматическом создании целевых папок, автоматическом переименовании при совпадении имен, проверке результата и выдаче сообщений уже по завершении задачи. Поддерживаются абсолютные и относительные пути, возможно использование переменных текущего времени, даты, папки и расширения файла для получения конечного пути. Кроме того, возможно логирование производимых операций.
Позволяет производить копирование, перемещение, переименование с появлением отдельного окна ввода, добавление суффиксов и префиксов, сохранение на месте (без суффикса "_proc") с сохранением оригинала в заданной папке.
Пояснения и примеры - смотри скрипт.

#NoEnv 
SetWorkingDir %A_ScriptDir%
SetKeyDelay 50, 50
#SingleInstance Force
#NoTrayIcon

/*
Скрипт предназначен для работы с пользовательскими командами JPEGView, синтаксис которых описан в JPEGView.ini. Отличие от простых команд (copy, move и пр.) в автоматическом создании целевых папок, автоматическом переименовании при совпадении имен, проверке результата и выдаче сообщений уже по завершении задачи. Поддерживаются абсолютные и относительные пути, возможно использование переменных текущего времени, даты, папки и расширения файла для получения конечного пути. Кроме того, возможно логирование производимых операций. 
Позволяет производить копирование, перемещение, переименование с появлением отдельного окна ввода, добавление суффиксов и префиксов, сохранение на месте (без суффикса "_proc") с сохранением оригинала в заданной папке.

Скрипт позволяет использовать следующие переменные:
$date - текущая дата в формате 2015-06-12
$time - текущее время в формате 15.27.06 
$folder - имя папки исходного файла
$file - имя файла без расширения
$ext - его расширение

Команды:
1. rename - переименование на месте с появлением отдельного окна ввода имени: 
    
UserCmd0="KeyCode: Shift+R Cmd: '"C:\Program Files\AutoHotkey\AutoHotkey.exe" %exepath%\JPEGView.ahk rename %filename%' Flags: 'WaitForTerminate ReloadFileList MoveToNext'"

Здесь первые два члена команды - путь к исполняемому файлу Autohotkey и собственно скрипту, в данном случае находящемуся в папке программы. Можно скомпилировать скрипт и заменить эти два члена одним.
JPEGView переходит к следующему файлу не дожидаясь окончания, но это не страшно, т.к исходное имя файла отображается в окне переименования.

2. Добавление суффиксов и префиксов - команды вида <... и ...> соответственно (возможно использование переменных). Добавление префикса "_" :

UserCmd1="KeyCode: Shift+1 Cmd: '"C:\Program Files\AutoHotkey\AutoHotkey.exe" %exepath%\JPEGView.ahk <_ %filename%' Flags: 'WaitForTerminate ReloadFileList MoveToNext'"

3. move - перемещение. Удаление файла в мусорную папку:

UserCmd2="KeyCode: Ctrl+Del Cmd: '"C:\Program Files\AutoHotkey\AutoHotkey.exe" %exepath%\JPEGView.ahk move %filename% D:\JPEGView\Trash\$folder' Flags: 'WaitForTerminate ReloadFileList MoveToNext'"

4. copy - копирование. Все то же, но MoveToNext не надо. Копирование в паку с датой и добавлением префикса из имени папки:

UserCmd3="KeyCode: Shift+3 Cmd: '"C:\Program Files\AutoHotkey\AutoHotkey.exe" %exepath%\JPEGView.ahk copy %filename% D:\JPEGView\$date\$folder_$file.$ext' Flags: 'WaitForTerminate ReloadFileList'"


5. saveold - сохранение файла на месте, без суффикса "_proc", с сохранением оригинала в заданную папку:

UserCmd4="KeyCode: Shift+S Cmd: '"C:\Program Files\AutoHotkey\AutoHotkey.exe" %exepath%\JPEGView.ahk saveold %filename% D:\JPEGView\Old\$folder'"

P.S. Пользовательские команды требуют последовательной нумерации от 0 без пропусков!    
*/

mess:=1 ; cообщать об успешных действиях (0 - только об ошибках)
log:=2 ; логирование операций (2 - с разбивкой по дням)
log_dir:="logs" ; папка сохранения логов

SetTimer Exit, 60000, 1
Loop %0%
    par%A_Index%:=%A_Index%
SplitPath par2, s_file, s_dir, s_ext, s_name
FormatTime date, , yyyy-MM-dd
FormatTime time, , HH.mm.ss
folder:=RegExReplace(s_dir,".+\\")
folder:=RegExReplace(folder,":")
StringReplace par1, par1, % $date, % date
StringReplace par1, par1, $time, % time
StringReplace par1, par1, $folder, % folder
StringReplace par1, par1, $file, % s_name
StringReplace par1, par1, $ext, % s_ext
StringReplace par3, par3, $date, % date
StringReplace par3, par3, $time, % time
StringReplace par3, par3, $folder, % folder
StringReplace par3, par3, $file, % s_name
StringReplace par3, par3, $ext, % s_ext
WinGet id, ID, ahk_exe JPEGView.exe
If (!par1 || !s_file)
    goto Error
If (par1="rename") 
{
    mes:="Введите новое имя файла без расширения:"
    Input:    
    InputBox name_new, % s_file, % mes, , 800, 130, , , , ,% s_name
    If Errorlevel || (name_new=s_name)
        return
    path_new:=s_dir "\" name_new "." s_ext    
    If FileExist(path_new)
        mes:="Файл существует!", goto Input
    FileMove % par2,% path_new
    e:=Errorlevel, text:="Успешно переименовано!"
}
If RegExMatch(par1,"^<\K.+",pref)
{
    path:=s_dir "\" pref . s_name "." s_ext
    FileMove % par2, % path
    e:=Errorlevel, text:="Добавлен префикс " pref
}    
If RegExMatch(par1,".+(?=>)",suff)
{
    path:=s_dir "\" s_name . suff "." s_ext
    FileMove % par2, % path
    e:=Errorlevel, text:="Добавлен суффикс " suff
}    
If par1 in copy,move,saveold
{
    If !path:=par3
        goto Error
    If !RegExMatch(par3,"i)\.[a-z]{3,4}$")
    {
        t_dir:=RegExReplace(par3,"\\$")
        path:=RenIfExist(t_dir "\" s_file,2)
    }
    else
    {
        SplitPath par3, , t_dir
        path:=RenIfExist(path,2)
    }    
    FileCreateDir % t_dir
    If (par1="copy")
    {
        FileCopy, % par2,% path
        e:=Errorlevel, text:="Скопировано в `n" path
    }
    If (par1="move")
    {
        FileMove, % par2,% path
        e:=Errorlevel, text:="Перемещено в `n" path
    }
    If (par1="saveold")
    {
        Send ^{vk53}
        WinWaitNotActive % "ahk_id " id, , 3
        If Errorlevel || !WinActive("ahk_exe JPEGView.exe")
            return
        WinGet id2, ID, A
        FileCopy % par2, % path            
        If e:=Errorlevel
            goto End
        ControlSetText Edit1, % par2
        ControlSend Edit1, {Enter}
        Sleep 300
        If !(WinActive("ahk_id " id) || WinActive("ahk_id " id2))
            Send {Left}{Enter}
        If !FileExist(par2)
            e2:=1
        text:="Сохранено. Оригинал перемещен в `n" par3            
    }
}
End:
Sleep 200
If e || e2
    MsgBox, 16, Ошибка, Не выполнено!
else If mess
        MsgBox, 64, Информация, % text, 1.5    
If log
{
    FileCreateDir % log_dir
    If (log=2)
        date:=A_YYYY "." A_MM "." A_DD "_"
    FileAppend % "`n`n###  " A_DD "." A_MM "." A_YYYY "  " A_Hour ":" A_Min "  ###`nsource:      " par2 "`naction:      " par1 "`ntarget:      " path "`nerrors:      " e "  " e2, % RegExReplace(log_dir,"\\$") "\" date "JPEGView.log"
}
Exit:
ExitApp

Error:
MsgBox, 16, Ошибка, Неверно заданы параметры!
ExitApp

RenIfExist(f_path,tab="1")
{
    If ! FileExist(f_path)
        return f_path
    SplitPath f_path, , dir, ext, file
    Loop % dir "\" file "*." ext
    {
        n:=0
        RegExMatch(A_LoopFileName,"(?<=_)\d+?(?=\.\w{2,4}$)",n)
        If ! n
            n_max:=0
        If (n>n_max)
            n_max:=n
    }
    SetFormat float, % "0" tab
    return dir "\" file "_" n_max+1.0 "." ext
}

2

Re: AHK: Два скрипта для просмотрщика графики JPEGView

ExifTool не понимает юникодные символы в имени файла!

Разве?
WINDOWS UNICODE FILE NAMES
Q: How does ExifTool handle coded character sets?
Q: Special characters don't display properly in my Windows console

3

Re: AHK: Два скрипта для просмотрщика графики JPEGView

Сейчас не вспомню где, но на страницах программы было такое сообщение. Практически же у меня все так и есть. И не только у меня: использующие его программы (XnView, ExifToolGui) кашу в тэгах дают очень часто.

4

Re: AHK: Два скрипта для просмотрщика графики JPEGView

Прописывание в параметрах -charset cp65001 ничего не меняет.
Нужно задавать кодировку для каждого конкретного случая, что не вариант.

5

Re: AHK: Два скрипта для просмотрщика графики JPEGView

Насколько я понимаю, нужно брать в качестве параметра именно UTF8, а не псевдоним. А как работать с выводом отражено в ответе по 3 ссылке.
И что понимается под каждым случаем?