AkulaBig
|
Posted: Fri May 15, 2026 18:23 Post subject: |
|
|
| Orion9 wrote: | | чем вас не устроил этот вариант для vbs? |
Не устраивает тем, что все эти варианты не работают в wdx-плагине.
Ну вот переписал я его под au3:
 Hidden text | Code: | #NoTrayIcon
If StringInStr(FileGetAttrib($filename), "D") Then Exit
Local $sExifPath = EnvGet("util_ET") ; Путь к exiftool
Global $sArgFile = @TempDir & "\exiftool_args.txt"
Global $sOutFile = @TempDir & "\exiftool_out.txt"
; Подготовка файла аргументов
FileDelete($sArgFile)
FileWrite($sArgFile, "")
FileDelete($sOutFile)
; Запуск процесса ExifTool (один раз)
; Используем $STDIN_CHILD + $STDOUT_CHILD для взаимодействия
Global $iPID = Run($sExifPath & ' -stay_open True -@ "' & $sArgFile & '"', "", @SW_HIDE, 0x3)
$content = _ExifTool_GetTag($filename, "Title")
; MsgBox(64, "Результат", $content)
; Закрываем ExifTool
_ExifTool_Quit()
ConsoleWrite($content)
; --- Функция получения данных ---
Func _ExifTool_GetTag($sFile, $sTag)
; Если файл вывода существует, удаляем его перед новой командой
FileDelete($sOutFile)
; Формируем команду
; -s3: только значение
Local $sCmd = "-s3" & @LF & "-" & $sTag & @LF & $sFile & @LF & "-W!" & @LF & $sOutFile & @LF & "-execute" & @LF
; Записываем команду в файл аргументов
Local $hFile = FileOpen($sArgFile, 1) ; 1 = Write mode (append)
FileWrite($hFile, $sCmd)
FileClose($hFile)
; ; 3. Ждем, пока ExifTool создаст файл (цикл ожидания)
; Local $iWaitCount = 0
; While Not FileExists("$sOutFile")
; Sleep(50)
; $iWaitCount += $iWaitCount
; if $iWaitCount > 2000 then ExitLoop ; Таймаут 2 сек
; Wend
Local $sTagValue = "<time-out>"
For $i = 1 To 50
If FileExists("$sOutFile") Then
$sTagValue = FileRead("$sOutFile")
ExitLoop
EndIf
Sleep(20)
Next
; ; 3. Ждем, пока ExifTool создаст файл (цикл ожидания)
; Local $iWaitCount = 0
; While Not FileExists("$sOutFile")
; Sleep(50)
; $iWaitCount += $iWaitCount
; if $iWaitCount > 2000 then ExitLoop ; Таймаут 2 сек
; Wend
;
;
; ; 4. Читаем результат в переменную
; Local $sTagValue = FileRead("$sOutFile")
; MsgBox(64, "Результат", $sTagValue)
Return $sTagValue
EndFunc
; --- Функция закрытия ---
Func _ExifTool_Quit()
Local $hFile = FileOpen($sArgFile, 1)
FileWrite($hFile, "-stay_open" & @LF & "False" & @LF)
FileClose($hFile)
ProcessWaitClose("exiftool.exe")
FileDelete($sArgFile)
FileDelete($sOutFile)
EndFunc |
И вот результат:
Несколько вариантов задержки пробовал. На всех языках результат примерно одинаковый. Файл аргументов правильный, выходной файл правильный. Что еще надо? Конечно, как видите, ET запускается для каждого файла. Но, как минимум, первый файл обязан правильно отработать. Тем более что в выходном файле значение правильное.
| Orion9 wrote: | | как говорил один дзен мастер "свои 15000 строк я уже написал, теперь ваша очередь |
Но этот-же сансей говорил: "Докажи своим примером, что это возможно"
Кстати, с использованием потоков у меня результат даже лучше. Там хотя-бы в MsgBox правильное значение показывается. А вот в консоль такое-же выводится. |
|