AkulaBig
|
Posted: Wed Sep 30, 2026 18:03 Post subject: |
|
|
Orion9
Вот вариант с временными файлами. Ваш вариант летает как ракета, если FieldIndex = 1. Но кривой вывод:
А если оставить -G -S, то только на английском и с наименованием группы.
А вот мой вариант с корректным выводом полей, но без FieldIndex:
 Hidden text
| Code: |
Func ET(FileName, FieldIndex, UnitIndex)
# Расположение файла Autorun.ini
# Location of Autorun.ini file
Local ini_TypeHints = COMMANDER_PATH & "\Ini\Autorun.ini"
# Читаем номер вида
# Reading type number
Local TypeHintsNum = IniRead(ini_TypeHints, "TypeHints", "CurrVal", 0)
# 0 - стандартный вид подсказки над файлами
# 1 - расширенный вид подсказки над файлами
If TypeHintsNum = 0 Then Return
If StrPos(FileGetAttr(FileName), "D") Then Return
Local iPID = 0, sOutFile = TEMP & "\out.txt", sArgFile = TEMP & "\args.txt"
iPID = ProcessGetId("exiftool.exe")
If iPID = 0 Then
FileWrite(sArgFile, "", "UTF-8 NOBOM")
ShellExec /TT /SW_HIDE %util_ET% "-stay_open True -@ ""%sArgFile%"""
EndIf
# ShellExec /SW_HIDE /WAIT %COMSPEC% "/c break > ""%sOutFile%"""
DllCall("kernel32.dll\DeleteFileW", "Wstr", sOutFile)
Local ansi
If FieldIndex = 1 Then
Local sArgs = "-lang" & auCRLF & _
"ru" & auCRLF & _
"-m" & auCRLF & _
"-q" & auCRLF & _
"-q" & auCRLF & _
"-W+!" & auCRLF & _
sOutFile & auCRLF & FileName & auCRLF & "-execute" & auCRLF
Local obj = BinaryFile(sArgFile, "a")
obj.WriteStr(sArgs, "", "UTF-8")
Free(obj)
# Проверяем наличие файла для записи данных
While 1
If FileExist(sOutFile) Then
# Читаем данные из файла
ansi = FileRead(sOutFile)
If ansi <> "" Then
# ShellExec /SW_HIDE /WAIT %COMSPEC% "/c break > ""%sOutFile%"""
DllCall("kernel32.dll\DeleteFileW", "Wstr", sOutFile)
Break
EndIf
EndIf
Sleep(10)
WEnd
EndIf
Return TrimSpaces1(StrPart(ansi, auLF, FieldIndex))
EndFunc
Func TrimSpaces1(String)
Local a, b
If Not StrPos(String, ":") Then Return String
a = StrPart(String, ": ", 1)
b = StrPart(String, ": ", 2)
Return StrTrim(FixCPET(a)) & ": " & StrTrim(FixCPET(b))
EndFunc
Func FixCPET(String)
Static a = List(), u = List()
Local ansi = String, utf8, wrong = Chr(0xFFFD)
Local nSize = StrLen(ansi)
Local buf = Buffer(nSize)
buf.Zero()
buf.SetStr(ansi, 0, nSize, "ANSI")
utf8 = buf.GetStr(0, nSize, "CP:65001")
Free(buf)
a.Count = 0
u.Count = 0
a.Text = ansi
u.Text = utf8
For i = 0 to u.Count - 1
If StrPos(u[i], wrong) Then u[i] = a[i]
Next
Return u.text
EndFunc
|
Он работает медленно. А если прописать FieldIndex, то получается фигня:
Но с MI этот-же алгоритм работает без проблем. Очень хочется добиться быстрой и правильной работы. |
|