1 (изменено: emmetoya, 2014-10-15 17:51:44)

Тема: AHK: получить в переменную результат работы другой программы

При помощи консольной утилиты из пакета ImageMagick сравниваю два графических файла на "различность".
Все файлы лежат в инсталляционной папке "C:\Program Files\ImageMagick-6.8.9-Q16\"

Команда: compare -verbose -metric mepp m11.jpeg m3.jpeg m3.png

Результат выводится в виде

C:\Program Files\ImageMagick-6.8.9-Q16>compare -verbose -metric mepp m11.jpeg m22.jpeg m3.png
m11.jpeg JPEG 434x322 434x322+0+0 8-bit sRGB 83.7KB 0.016u 0:00.013
m3.jpeg JPEG 434x322 434x322+0+0 8-bit sRGB 31KB 0.000u 0:00.002
Image: m11.jpeg
  Channel distortion: MEPP
    7.21924e+009 (0.13678, 1)
writing raw profile: type=8bim, length=8060
writing raw profile: type=exif, length=6140
writing raw profile: type=iptc, length=15
writing raw profile: type=xmp, length=3432
m11.jpeg=>m3.png JPEG 434x322 434x322+0+0 8-bit sRGB 17220.170630945224/0.136780
/1.000000db 112KB 0.577u 0:00.152

Мне необходимо в скрипт передать результирующее значение 0.13678 и дальше обработать как переменную.
Из тех вариантов что мне пришли в голову:
1. Пишем результат в файл compare -verbose -metric mepp m11.jpeg m22.jpeg m3.png 2>m.txt дальше исхитряться, выделяя из него нужное. Но по-моему это кривой способ.
2. Написать bat файл, который результатом будет передавать переменную с нужным значением, но как это сделать вообще непонятно..

Подскажите как еще можно это сделать?

2

Re: AHK: получить в переменную результат работы другой программы

Серый форум ? Коллекция скриптов и идей ? AutoHotkey ? AHK: Запуск консольного приложения с перехватом его ввода и вывода - это вроде то, что надо, для получения скриптом вывода утилиты из пакета ImageMagick.
Ну а дальше распарсить вывод (см. команды из раздела 'string management' в autohotkey.chm), отрезав всё, кроме нужного.

3 (изменено: Malcev, 2014-10-15 20:26:35)

Re: AHK: получить в переменную результат работы другой программы

Зачем такие сложности?
Достаточно:

objShell := ComObjCreate("WScript.Shell")
objExec := objShell.Exec(ComSpec " /C systeminfo.exe ")
strStdOut := ""
while, !objExec.StdOut.AtEndOfStream
   strStdOut := objExec.StdOut.ReadAll()
MsgBox %strStdOut%

4 (изменено: emmetoya, 2014-10-15 22:11:42)

Re: AHK: получить в переменную результат работы другой программы

Спасибо, похоже как раз на то что было нужно.

p.s. с разбором строк в принципе работает - регулярными выражениями вычистил ненужное из требуемой строки в файле

    FileReadLine, valueString, C:\m.txt, 1
    resultStr1 := RegExReplace(valueString, "^.*\(", "")
    resultStr1 := RegExReplace(resultStr1, "..[01]\)", "")
    MsgBox, %resultStr1%

Результатом выдает строку с нужными значениями (кстати не до конца понял - полученные строки можно перемножать как числовые переменные, однако сравнение if resultStr1 > resultStr2 работает криво, будто сравнивает длину строки, но не числовое значение). Минус этого варианта - лишнее обращение к файлу, поэтому надо разобраться с вариантом Malcev

Подскажите пожалуйста с синтаксисом, MsgBox вылетает пустой, перепробовал кучу вариантов бесполезно..

!c::
    compareTool= C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe
    pic1 = " C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg "
    pic2 = "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg "
    pic3 = "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objExec := objShell.Exec(ComSpec " /C " compareTool  -metric mepp pic1 pic2 pic3)
    strStdOut := ""
    while, !objExec.StdOut.AtEndOfStream
       strStdOut := objExec.StdOut.ReadAll()
    MsgBox %strStdOut%

return

В тоже время .bat

"C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe" -metric mepp "C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg" "C:\Program Files\ImageMagick-6.8.9-Q16\m3.jpeg" "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"

отрабатывает нормально

5

Re: AHK: получить в переменную результат работы другой программы

emmetoya пишет:

Подскажите пожалуйста с синтаксисом, MsgBox вылетает пустой, перепробовал кучу вариантов бесполезно..

Наверное, так:

    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := " C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg "
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg "
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objShell.Exec("cmd /C " . compareTool && compare -verbose -metric mepp" . pic1 . pic2 . pic3)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: получить в переменную результат работы другой программы

teadrinker пишет:
emmetoya пишет:

Подскажите пожалуйста с синтаксисом, MsgBox вылетает пустой, перепробовал кучу вариантов бесполезно..

Наверное, так:

    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := " C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg "
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg "
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objShell.Exec("cmd /C " . compareTool && compare -verbose -metric mepp" . pic1 . pic2 . pic3)

Ругается на illegal variable mepp

Дико извиняюсь, оказалось что именно утилита compare выдает в STDERR. В VBS ничего не понимаю, но предположить могу - такая конструкция имеет право на жизнь (просто поменять StdOut на StdErr)?

    strStdErr := ""
    while, !objExec.StdErr.AtEndOfStream
       strStdOut := objExec.StdErr.ReadAll()
    MsgBox %strStdErr%

7

Re: AHK: получить в переменную результат работы другой программы

Не, не так:


    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := " C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg "
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg "
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objShell.Exec("cmd /C " . compareTool . " && compare -verbose -metric mepp" . pic1 . pic2 . pic3)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: получить в переменную результат работы другой программы

Ещё отредактировал.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9 (изменено: emmetoya, 2014-10-15 23:02:27)

Re: AHK: получить в переменную результат работы другой программы

teadrinker пишет:

Ещё отредактировал.

!c::
    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := " C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg "
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg "
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objShell.Exec("cmd /C " . compareTool . " && -metric mepp" . pic1 . pic2 . pic3)
    strStdErr := ""
    while, !objExec.StdErr.AtEndOfStream
       strStdErr := objExec.StdErr.ReadAll()
    MsgBox %strStdErr%

return

" && compare -verbose -metric mepp"

исправил в

" && -metric mepp"

compare -verbose: первый элемент это от батника наверное переполз - имя экзешника, -verbose модификатор вывода для более подробного результата..
Но все равно по нулям, теперь даже MsgBox не появляется.

p.s.исходя из того что не генерится результирующий файл можно сделать вывод, что строка сформирована неправильно, иначе бы он отработал и после этого вывел результат?

10

Re: AHK: получить в переменную результат работы другой программы

А так:

!c::
    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := "C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg"
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg"
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objShell.Exec("cmd /C """ . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """")
    strStdErr := ""
    while, !objExec.StdOut.AtEndOfStream
       strStdErr := objExec.StdOut.ReadAll()
    MsgBox %strStdErr%

return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: получить в переменную результат работы другой программы

Ещё отредактировано.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: получить в переменную результат работы другой программы

И ещё.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: получить в переменную результат работы другой программы

Не работает, НО в документации написано что должны быть двойные двойные кавычки в аргументах (я так понимаю речь о путях к обрабатываемым файлам), надо попробовать.

14

Re: AHK: получить в переменную результат работы другой программы

Сейчас и есть двойные.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15 (изменено: emmetoya, 2014-10-15 23:32:28)

Re: AHK: получить в переменную результат работы другой программы

teadrinker пишет:

Сейчас и есть двойные.


Увы и пах))))) не работает зараза!!

!c::
    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := "C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg"
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg"
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objShell.Exec("cmd /C """ . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """")
    strStdErr := ""
    while, !objExec.StdOut.AtEndOfStream
       strStdErr := objExec.StdOut.ReadAll()
    MsgBox %strStdErr%

return

Я к сожалению никак не могу на сайте найти описание, но был пример вроде такого,

objShell.Exec("compare ""pic1"" ""pic2"" "pic3"")

Что-то мне подсказывает что чрезмерно много двойных кавычек набралось выше)))

Вот например, от другой команды пример, но для синтаксиса не суть:

command = "identify -format ""%[EXIF:FocalLength]"" """ & strFileIn & """"
  Set objExec = wsh.Exec(command)
  strf = objExec.StdOut.Readline

16

Re: AHK: получить в переменную результат работы другой программы

emmetoya пишет:

Что-то мне подсказывает что чрезмерно много двойных кавычек набралось выше)))

Каждый из названий файлов обрамлён сейчас в кавычки. Можно посмотреть, правильно или нет, так:

compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
pic1 := "C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg"
pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg"
pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"

MsgBox, % "cmd /C """ . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """"
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: получить в переменную результат работы другой программы

teadrinker пишет:
emmetoya пишет:

Что-то мне подсказывает что чрезмерно много двойных кавычек набралось выше)))

Каждый из названий файлов обрамлён сейчас в кавычки. Можно посмотреть, правильно или нет, так:

compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
pic1 := "C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg"
pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg"
pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"

MsgBox, % "cmd /C """ . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """"

Строка похожа на правду, смущает только

cmd /C

в начале. Обязательная часть строки для VBS?

18

Re: AHK: получить в переменную результат работы другой программы

Я просто в данном случае скопировал командную строку, как в батнике. Можно ещё без cmd /c попробовать:

!c::
    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := "C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg"
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg"
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objShell.Exec("""" . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """")
    strStdOut := ""
    while, !objExec.StdOut.AtEndOfStream
       strStdErr := objExec.StdOut.ReadAll()
    MsgBox %strStdOut%

return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: AHK: получить в переменную результат работы другой программы

teadrinker пишет:

Я просто в данном случае скопировал командную строку, как в батнике. Можно ещё без cmd /c попробовать:

!c::
    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := "C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg"
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg"
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objShell.Exec("""" . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """")
    strStdErr := ""
    while, !objExec.StdErr.AtEndOfStream
       strStdErr := objExec.StdErr.ReadAll()
    MsgBox %strStdErr%

return

Без CMD ЗАРАБОТАЛ!
Все равно не выводит в %strStdErr%, скрипт зависает и повторно запускается только после релоада, но он теперь генерит результирующие файлы, а значит дело с мертвой точки сдвинулось.
СПАСИБО!!! Думаю дальше заморочки уже с выводом StdErrю

20

Re: AHK: получить в переменную результат работы другой программы

А если заменить

    while, !objExec.StdErr.AtEndOfStream
       strStdErr := objExec.StdErr.ReadAll()

на

    while, !objExec.StdOut.AtEndOfStream
       strStdErr := objExec.StdOut.ReadAll()

?
Вообще-то так правильнее.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21 (изменено: emmetoya, 2014-10-16 00:01:03)

Re: AHK: получить в переменную результат работы другой программы

teadrinker пишет:

А если заменить

    while, !objExec.StdErr.AtEndOfStream
       strStdErr := objExec.StdErr.ReadAll()

на

    while, !objExec.StdOut.AtEndOfStream
       strStdErr := objExec.StdOut.ReadAll()

?
Вообще-то так правильнее.

С буржуинского форума:

Re: Capture return value from Compare tool in Visual Basic
The comparison value goes to stderr. You need some way of capturing stderr from Visual Basic. I don't know what that method is.

Поэтому я и предположил что нужно попробовать на StdErr поменять, StdOut ничего не выдает. Даже MsgBox не вылетает, будто objExec.StdErr.AtEndOfStream всегда false. Но тут я совершенно ничего не понимаю - VBS не моя тема ни разу, нужно будет спросить в соседнем подфоруме по VBS, может что подскажут.
Был еще вариант указать в строке запуска в конце " 2>1.txt" чтобы результат выводился в файл и (может быть) он бы попал в StdOut, но это тоже не оправдалось. Тем более что в консоли результат запуска есть, значит все же выводит даже без указания " 2>1.txt"

22

Re: AHK: получить в переменную результат работы другой программы

А так:

!c::
    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := "C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg"
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg"
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    MsgBox, % CMDret("""" . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """")
    Return

CMDret(sCmd)
{
   DllCall("CreatePipe","Ptr*",hStdInRd
                       ,"Ptr*",hStdInWr
                       ,"Uint",0
                       ,"Uint",0)
   DllCall("CreatePipe","Ptr*",hStdOutRd
                       ,"Ptr*",hStdOutWr
                       ,"Uint",0
                       ,"Uint",0)
   DllCall("SetHandleInformation","Ptr",hStdInRd
                                ,"Uint",1
                                ,"Uint",1)
   DllCall("SetHandleInformation","Ptr",hStdOutWr
                                ,"Uint",1
                                ,"Uint",1)

   if A_PtrSize=4
      {
      VarSetCapacity(pi, 16, 0)
      sisize:=VarSetCapacity(si,68,0)
      NumPut(sisize,    si,  0, "UInt")
      NumPut(0x100,     si, 44, "UInt")
      NumPut(hStdInRd , si, 56, "Ptr")
      NumPut(hStdOutWr, si, 60, "Ptr")
      NumPut(hStdOutWr, si, 64, "Ptr")
      }
   else if A_PtrSize=8
      {
      VarSetCapacity(pi, 24, 0)
      sisize:=VarSetCapacity(si,96,0)
      NumPut(sisize,    si,  0, "UInt")
      NumPut(0x100,     si, 60, "UInt")
      NumPut(hStdInRd , si, 80, "Ptr")
      NumPut(hStdOutWr, si, 88, "Ptr")
      NumPut(hStdOutWr, si, 96, "Ptr")
      }

   DllCall("CreateProcess", "Uint", 0
                           , "Ptr", &sCmd
                          , "Uint", 0
                          , "Uint", 0
                           , "Int", True
                          , "Uint", 0x08000000
                          , "Uint", 0
                          , "Uint", 0
                           , "Ptr", &si
                           , "Ptr", &pi)

   DllCall("CloseHandle","Ptr",NumGet(pi,0))
   DllCall("CloseHandle","Ptr",NumGet(pi,A_PtrSize))
   DllCall("CloseHandle","Ptr",hStdOutWr)
   DllCall("CloseHandle","Ptr",hStdInRd)
   DllCall("CloseHandle","Ptr",hStdInWr)

   VarSetCapacity(sTemp,4095)
   nSize:=0
   loop
      {
      result:=DllCall("Kernel32.dll\ReadFile", "Uint", hStdOutRd
                                             ,  "Ptr", &sTemp
                                             , "Uint", 4095
                                             ,"UintP", nSize
                                              ,"Uint", 0)
      if (result="0")
         break
      else
         sOutput:= sOutput . StrGet(&sTemp,nSize,"CP866")
      }

   DllCall("CloseHandle","Ptr",hStdOutRd)
   Return,sOutput
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK: получить в переменную результат работы другой программы

Пустое сообщение.

Похоже что работа с результатами этой утилиты может осуществляться только через файл. Что на профильном форуме куча постов с нулевым результатом, что тут:

Problem getting terminal output from ImageMagick's compare.exe

The compare tool outputs the result on stderr. Of course that totally does not make sense, but to work around it you need to forward stderr to a file (instead of stdout)

24

Re: AHK: получить в переменную результат работы другой программы

Ну тогда через файл и выводите, потом парсите результат и удаляйте файл.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

25

Re: AHK: получить в переменную результат работы другой программы

teadrinker пишет:
!c::
    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := "C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg"
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg"
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objShell.Exec("""" . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """")
    strStdOut := ""
    while, !objExec.StdOut.AtEndOfStream
       strStdErr := objExec.StdOut.ReadAll()
    MsgBox %strStdOut%

return

Откуда у тебя здесь objExec берётся? Это должно быть значение, возвращаемое objShell.Exec.

26

Re: AHK: получить в переменную результат работы другой программы

Да, точно, выпустил при самом первом копировании, правильно так будет:

!c::
    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := "C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg"
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg"
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objExec := objShell.Exec("""" . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """")
    strStdOut := ""
    while, !objExec.StdOut.AtEndOfStream
       strStdErr := objExec.StdOut.ReadAll()
    MsgBox %strStdOut%

return

Правда, этот вариант тоже не сработал...

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

27

Re: AHK: получить в переменную результат работы другой программы

Ну да, правильно. Считываешь в одну переменную, а выводишь в MsgBox другую.

А вообще для тестовой программки, выводящей в StdError, работает как этот вариант, так и CmdRet.

28

Re: AHK: получить в переменную результат работы другой программы

YMP пишет:

Считываешь в одну переменную, а выводишь в MsgBox другую.

В смысле, хочешь сказать, я и там какие-то переменные перепутал? Там в MsgBox выводится непосредственно то, что CmdRet возвращает.

А вообще для тестовой программки, выводящей в StdError, работает как этот вариант, так и CmdRet.

У меня тоже оба варианта сработали.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

29

Re: AHK: получить в переменную результат работы другой программы

Нет, я про код в посте 26. Читаешь в strStdErr, а выводишь strStdOut.

30 (изменено: emmetoya, 2014-10-16 08:21:21)

Re: AHK: получить в переменную результат работы другой программы

С новыми силами еще раз попробую..
Ну что сказать,

!c::
    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := "C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg"
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg"
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objExec := objShell.Exec("""" . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """")
    strStdOut := ""
    while, !objExec.StdOut.AtEndOfStream
       strStdOut := objExec.StdOut.ReadAll()
    MsgBox %strStdOut%

return

выводит пустой MsgBox. Не считывает! Точнее я думаю считывает, но там пусто.

И почему мы тут считываем objExec.StdOut если в документации к утилите четко сказано, что она отправляет в StdErr??
Или в ваших тестах этим кодом удалось вывести результат работы тестовой программы, выводящей в StdErr?

Изменения:
Или с утра голова прояснилась, или звузды легли по-другому, но код (который вчера тоже пробовал)

!d::
    compareTool := "C:\Program Files\ImageMagick-6.8.9-Q16\compare.exe"
    pic1 := "C:\Program Files\ImageMagick-6.8.9-Q16\m11.jpeg"
    pic2 := "C:\Program Files\ImageMagick-6.8.9-Q16\m22.jpeg"
    pic3 := "C:\Program Files\ImageMagick-6.8.9-Q16\m3.png"
    objShell := ComObjCreate("WScript.Shell")
    objExec := objShell.Exec("""" . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """")
    strStdErr := ""
    while, !objExec.Stderr.AtEndOfStream
    strStdErr := objExec.Stderr.ReadAll()
    MsgBox %strStdErr%

return

Заработал! Обрабатывает, в переменную принимает значения, MsgBox отображает результат.
Спасибо всем за участие!

31

Re: AHK: получить в переменную результат работы другой программы

offtopic

+ открыть спойлер

Опять COM-объекты. Полезная штука, да найти б где толково описано как ими пользоваться (а не просто список всех команд/объектов)...

32

Re: AHK: получить в переменную результат работы другой программы

emmetoya пишет:

Или с утра голова прояснилась, или звузды легли по-другому

Да нет, всё проще, этот вариант был опробован с ошибкой из-за того, что я скопировал неправильно:

objShell.Exec("""" . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """")

вместо

objExec := objShell.Exec("""" . compareTool . """ -metric mepp """ . pic1 . """ """ . pic2 . """ """ . pic3 . """")
Drugoy пишет:

Опять COM-объекты. Полезная штука, да найти б где толково описано как ими пользоваться

COM Object Reference, далее по ссылкам.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

33 (изменено: emmetoya, 2014-10-21 13:22:23)

Re: AHK: получить в переменную результат работы другой программы

Уточняющий вопрос по VBS, но в тему этого скрипта: есть ли аналог RunWait для запуска VBS скрипта? Мне нужно дождаться окончания работы утилиты прежде чем произойдет дальнейшая обработка.

34

Re: AHK: получить в переменную результат работы другой программы

emmetoya, у нас принято использовать заглавные буквы в начале предложений.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

35

Re: AHK: получить в переменную результат работы другой программы

teadrinker пишет:

emmetoya, у нас принято использовать заглавные буквы в начале предложений.

Поправил

36

Re: AHK: получить в переменную результат работы другой программы

У objExec есть свойство Status. Пока программа не завершилась, оно = 0.

37

Re: AHK: получить в переменную результат работы другой программы

YMP пишет:

У objExec есть свойство Status. Пока программа не завершилась, оно = 0.

Спасибо!

38

Re: AHK: получить в переменную результат работы другой программы

Можно ли сделать тоже самое, но не показывая окно CMD?

39

Re: AHK: получить в переменную результат работы другой программы

Вписать в начале:

DllCall("AllocConsole")
WinHide % "ahk_id " DllCall("GetConsoleWindow", "ptr")

40

Re: AHK: получить в переменную результат работы другой программы

Malcev пишет:

Вписать в начале:

DllCall("AllocConsole")
WinHide % "ahk_id " DllCall("GetConsoleWindow", "ptr")

Спасибо, работает!

41 (изменено: Malcev, 2015-09-16 20:06:23)

Re: AHK: получить в переменную результат работы другой программы

Есть ли какой-нибудь хитрый способ показывать в Cmd, что в данный момент исполняется, паралельно перенаправляя результат в strStdOut или strStdErr?
Так конечно же не получается - экран темный.

objShell := ComObjCreate("WScript.Shell")
objExec := objShell.Exec(ComSpec " /C echo list volume | C:\Windows\System32\diskpart.exe")
strStdOut := ""
while, !objExec.StdOut.AtEndOfStream
   strStdOut := objExec.StdOut.ReadAll()