Что нового

jpegtran и StdoutRead

Skif_off

Знающий
Сообщения
173
Репутация
12
Пытаюсь запустить jpegtran и прочитать вывод в консоль

Код:
$hFile = FileOpen('C:\Temp\jpgerror.txt', 1+128)
If $hFile = -1 Then
    MsgBox(4096, 'Ошибка', 'Невозможно открыть файл.')
    Exit
EndIf

$iPID = Run(@ScriptDir & '\jpegtran.exe -optimize "C:\Temp\123.jpg" "C:\Temp\testtmp.jpg"', '', @SW_HIDE, 2)
$sOut = StdoutRead($iPID)
FileWrite($hFile, $sOut)
FileClose($hFile)

И ничего. Поробовал так
Код:
$sOut = StdoutRead(Run(@ScriptDir & '\jpegtran.exe -optimize "C:\Temp\123.jpg" "C:\Temp\testtmp.jpg"', '', @SW_HIDE, 2))

то же самое. jpegtran выводит в консоль только ошибку (одной строкой), поэтому 123.jpg - пустой текстовый файл, переименованный.
Подскажите, пожалуйста, как прочитать?

Так в консоли тоже не срабатывает:
Код:
jpegtran.exe -optimize C:\Temp\123.jpg C:\Temp\testtmp.jpg>>C:\Temp\jpgerror.txt

При этом в лог SciTE текст ошибки выводится.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Skif_off,
Похоже, что jpegtran.exe в консоль пишет только ошибки (если они есть).
Код:
;~ Файла 9test.jpg нет в @ScriptDir:
#include <Constants.au3>

Local $iPID, $sError
If @WorkingDir <> @ScriptDir Then FileChangeDir(@ScriptDir)
$iPID = Run('jpegtran.exe -progressive -copy none -optimize -outfile Newtest.jpg 9test.jpg"', '', @SW_HIDE, $STDERR_CHILD)
While 1
	$sError &= StderrRead($iPID)
	If @error Then ExitLoop
WEnd
If $sError Then
	ConsoleWrite('Error: ' & $sError & @LF)
Else
	ConsoleWrite('OK' & @LF)
EndIf
В консоли:
Код:
Error: jpegtran.exe: can't open 9test.jpg for reading
Код:
;~ Файл test.jpg есть в @ScriptDir:
#include <Constants.au3>

Local $iPID, $sError
If @WorkingDir <> @ScriptDir Then FileChangeDir(@ScriptDir)
$iPID = Run('jpegtran.exe -progressive -copy none -optimize -outfile Newtest.jpg test.jpg"', '', @SW_HIDE, $STDERR_CHILD)
While 1
	$sError &= StderrRead($iPID)
	If @error Then ExitLoop
WEnd
If $sError Then
	ConsoleWrite('Error: ' & $sError & @LF)
Else
	ConsoleWrite('OK' & @LF)
EndIf
В консоли:
Код:
OK
 
Автор
S

Skif_off

Знающий
Сообщения
173
Репутация
12
Спасибо, наверное, когда пробовал StderrRead($iPID) забыл сменить $STDOUT_CHILD на $STDERR_CHILD :smile: Или что-то с магнитным полем Солнца.
Так вроде работает
Код:
For $i = 1 To $aFileList[0]
    $iPID = Run(@ScriptDir & '\jpegtran.exe -optimize "' & $aFileList[$i] & '" "' & @TempDir & '\testtmp.jpg"', '', @SW_HIDE, 4)
    While 1
        $sOut &= StderrRead($iPID)
        If @error Then ExitLoop
    WEnd
    If $sOut <> '' Then
        $CounterError += 1
        $sError = StringRegExpReplace($sOut, "[\r\n]+", " ")
        FileWriteLine($hFile, $aFileList[$i] & @TAB & $sError)
    EndIf
Next
но в логе половина тестовых файлов с якобы ошибкой "Not a JPEG file: starts with 0x00 0x00 ", хотя если запускать в консоли, то только один файл с ошибкой, как и есть на самом деле. Ладно, это уже, по-ходу, карма :smile:
 
Верх