Что нового

[Автоматизация] Скрипт собранный в EXE не работает

Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
Вот это то, что работает. спасибо.
но есть проблема, если использовать RunWait($sRunWait, @SW_HIDE) вместо RunWait($sRunWait) то конвертирования не происходит
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Ты пропустил один параметр в RunWait. Посмотри внимательно справку по функции ;)
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
я читал и вроде бы там все остальные функции опциональны

edit: логика подсказывает что всё опционально и должно работать, но сработало вот так RunWait($sRunWait, "", @SW_HIDE)

edit2: теперь всё очень чётко работает, спасибо огромное. я многое для себя узнал!


Добавлено:
Сообщение автоматически объединено:

Я прошу прощения за даблпост, но тут совершенно дикая история. Настроил код на работу с другой программой (http://www.richwhitehouse.com/filemirror/noesisv4297.zip). В консоль выводится правильная строка - если её скопировать в окно командной строки и выполнить то конвертирование выполнится! Но если делать это через скомпилированный скрипт то будет ошибка и конвертирования не произойдёт.
скрипт:
Код:
#include <File.au3>

AutoItSetOption("MustDeclareVars", 1)

Local $i
Local $sSourceFile, $sDestFile, $sDestPath, $sExePath
Local $sDrive, $sFolder, $sFileName, $sExt, $sParams, $sRunWait

Local $sPattern = "\.(?i:ascii)"

If $CmdLine[0] <> 0 Then
    If FileExists("C:\Program Files (x86)\noesis\4231\Noesis.exe") Then
        ProgressOn("Converting", "", "0%")

        For $i = 1 To $CmdLine[0]
            $sSourceFile = $CmdLine[$i]

            ProgressSet(($i / $CmdLine[0]) * 100, $sFileName & $sExt, String(Round($i / $CmdLine[0] * 100, 1)) & "%")

            If FileExists($sSourceFile) Then
                _PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)

;~              If StringRegExp($sExt, "\A" & $sPattern & "\z", 0) = 1 Then
                    $sExePath = '"C:\Program Files (x86)\noesis\4231\Noesis.exe" ?cmode'
;~                     $sParams = '-rotate 90 0 0 -fbxnewexport -fbxreducekeys -fbxexportver FBX200900'
					$sParams = '-fbxexportver FBX201100'
;~ 					$sDestFile = _PathMake($sDrive, $sFolder, $sFileName, ".fbx")
					$sDestFile = '"' & $sDrive & StringTrimRight($sFolder, 1) & '\' & $sFileName & ".fbx" & '"'
                    $sSourceFile = '"' & $sSourceFile & '"'
                    $sRunWait = $sExePath & " " & $sSourceFile & " " & $sDestFile & " " & $sParams
					 ConsoleWriteError($sRunWait) ; отладка

					 RunWait($sRunWait)
;~              Else
;~                  ConsoleWriteError("Extension of file [" & $sSourceFile & "] is [" & $sExt & "] and not in [" & $sPattern & "]" & @CRLF)
;~              EndIf
            Else
                MsgBox(0, '', "File [" & $sSourceFile & "] not found")
            EndIf
        Next

        ProgressSet(100, "Converting complete", "100%")

        Sleep(1000)
        ProgressOff()
    EndIf
Else
    MsgBox(0, "Usage", "Drop file(s) on " & @ScriptName)
    ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
EndIf

Exit (0)


файл для примера:
https://drive.google.com/open?id=1CP9NplzX5JqqZKnWRcSuKjIb2cemOk6A
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
наверное потому, что
C:\Users\Brut\Desktop\noesisv4267>Noesis.exe ?cmode "C:\Users\Brut\Desktop\body_guard_1_body_barge.mesh.ascii" "C:\Users\Brut\Desktop\123.fbx" -fbxexportver FBX201100
Noesis console mode activated.
Noesis initialized.
Source file: C:\Users\Brut\Desktop\body_guard_1_body_barge.mesh.ascii
Dest file: C:\Users\Brut\Desktop\123.fbx
Options: -fbxexportver "FBX201100"
===
-fbxexportver parameter accepted.
Output extension has set output file type to:
.fbx - Autodesk FBX
Detected file type: Unknown
Nothing was exported!

или
---------------------------
Noesis Error
---------------------------
?cmode specified, but could not attach to parent console!
---------------------------
ОК
---------------------------


Добавлено:
Сообщение автоматически объединено:

в итоге, как я понял, причина, все-таки, в этом
? cmode указан, но не удалось подключиться к родительской консоли!
сработал другой код
Код:
RunWait(@ComSpec & ' /c ' & $sRunWait, '', @SW_HIDE)

получается, что само приложение ищет родительскую консоль, чтобы туда выдать результаты кодировки. Если её нет, то и делов нет :smile:


Добавлено:
Сообщение автоматически объединено:

или сам скрипт компилировать как консольное приложение, указав в начале кода
Код:
#pragma compile(Console, True)

тогда можно использовать
Код:
RunWait($sRunWait)
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
joiner сказал(а):
<...>
или сам скрипт компилировать как консольное приложение, указав в начале кода
Код:
#pragma compile(Console, True)

тогда можно использовать
Код:
RunWait($sRunWait)
так работает, только как сделать чтобы не появлялась консоль?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Параметр SW_HIDE
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
тогда обычная компиляция и
Код:
RunWait(@ComSpec & ' /c ' & $sRunWait, '', @SW_HIDE)
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
joiner сказал(а):
тогда обычная компиляция и
Код:
RunWait(@ComSpec & ' /c ' & $sRunWait, '', @SW_HIDE)
а это у меня вообще не работает. может быть ещё что-то нужно изменить чтобы эта строка заработала?


Добавлено:
Сообщение автоматически объединено:

т.е. у меня эта версия не падает и не показывает консольное окошко, но ничего не конвертирует.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Тот файл, который ты дал не конвертируется. Выше я дал описание ошибки. Я конвертировал обычный .jpg. Все сработало


Добавлено:
Сообщение автоматически объединено:

вот мой примерный код

Код:
#include <File.au3>

AutoItSetOption("MustDeclareVars", 1)
Local $cmdGUI = GUICreate('')
GUISetState(@SW_HIDE, $cmdGUI)
Local $i
Local $sSourceFile, $sDestFile, $sDestPath, $sExePath
Local $sDrive, $sFolder, $sFileName, $sExt, $sParams, $sRunWait

Local $sPattern = "\.(?i:ascii)"

If $CmdLine[0] <> 0 Then
	If FileExists("C:\Users\Brut\Desktop\noesisv4267\Noesis.exe") Then
		ProgressOn("Converting", "", "0%")
		For $i = 1 To $CmdLine[0]
			$sSourceFile = $CmdLine[$i]
			ProgressSet(($i / $CmdLine[0]) * 100, $sFileName & $sExt, String(Round($i / $CmdLine[0] * 100, 1)) & "%")
			If FileExists($sSourceFile) Then
				_PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)
				$sExePath = 'C:\Users\Brut\Desktop\noesisv4267\Noesis.exe ?cmode'
				$sParams = '-fbxexportver "FBX201100"'
				$sDestFile = '"' & $sDrive & StringTrimRight($sFolder, 1) & '\' & $sFileName & ".fbx" & '"'
				$sSourceFile = '"' & $sSourceFile & '"'
				$sRunWait = $sExePath & " " & $sSourceFile & " " & $sDestFile & " " & $sParams
				RunWait(@ComSpec & ' /c ' & $sRunWait, '', @SW_HIDE)
			Else
				MsgBox(0, '', "File [" & $sSourceFile & "] not found")
			EndIf
		Next
		ProgressSet(100, "Converting complete", "100%")
		Sleep(1000)
		ProgressOff()
	EndIf
Else
	MsgBox(0, "Usage", "Drop file(s) on " & @ScriptName)
	ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
EndIf

Exit (0)
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
joiner сказал(а):
Тот файл, который ты дал не конвертируется. Выше я дал описание ошибки. Я конвертировал обычный .jpg. Все сработало


Добавлено:
Сообщение автоматически объединено:

вот мой примерный код <...>


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

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
не конвертирует? какую ошибку в консоль пишет?
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
joiner сказал(а):
не конвертирует? какую ошибку в консоль пишет?
в консоли получается следующее:
Код:
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\autoit\convert_ascii_to_fbx.au3" "D:\00BCB111D67783/1FA83D69D89B24.ascii"   
C:\Windows\system32\cmd.exe /c "C:\Program Files (x86)\noesis\4231\Noesis.exe" ?cmode "D:\00BCB111D67783/1FA83D69D89B24.ascii" "D:\00BCB111D67783\1FA83D69D89B24.fbx" -fbxexportver FBX201100>Exit code: 0    Time: 1.208
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Не то. Что пишет конвертор в консоль? Noesis
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
joiner сказал(а):
Не то. Что пишет конвертор в консоль? Noesis
так ничего, окно не появляется

edit: вернее появляется но пропадает очень быстро

edit2: так, если ничего не напутал то используя команду /K определил, что в консоль выводится следующее:

Код:
"C:\Program" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
значит проблема в строке команды а не в коде. что то поправил не так
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
joiner сказал(а):
значит проблема в строке команды а не в коде. что то поправил не так
код у меня такой:

Код:
#include <File.au3>
;~ #pragma compile(Console, True)

AutoItSetOption("MustDeclareVars", 1)
Local $cmdGUI = GUICreate('')
GUISetState(@SW_HIDE, $cmdGUI)

Local $i
Local $sSourceFile, $sDestFile, $sDestPath, $sExePath
Local $sDrive, $sFolder, $sFileName, $sExt, $sParams, $sRunWait

Local $sPattern = "\.(?i:ascii)"

If $CmdLine[0] <> 0 Then
    If FileExists("C:\Program Files (x86)\noesis\4231\Noesis.exe") Then
        ProgressOn("Converting", "", "0%")

        For $i = 1 To $CmdLine[0]
            $sSourceFile = $CmdLine[$i]

            ProgressSet(($i / $CmdLine[0]) * 100, $sFileName & $sExt, String(Round($i / $CmdLine[0] * 100, 1)) & "%")

            If FileExists($sSourceFile) Then
                _PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)

;~              If StringRegExp($sExt, "\A" & $sPattern & "\z", 0) = 1 Then
                    $sExePath = '"C:\Program Files (x86)\noesis\4231\Noesis.exe" ?cmode'
;~                     $sParams = '-rotate 90 0 0 -fbxnewexport -fbxreducekeys -fbxexportver FBX200900'
					$sParams = '-fbxexportver FBX201100'
;~ 					$sDestFile = _PathMake($sDrive, $sFolder, $sFileName, ".fbx")
					$sDestFile = '"' & $sDrive & StringTrimRight($sFolder, 1) & '\' & $sFileName & ".fbx" & '"'
                    $sSourceFile = '"' & $sSourceFile & '"'
                    $sRunWait = $sExePath & " " & $sSourceFile & " " & $sDestFile & " " & $sParams
					 ConsoleWriteError(@ComSpec & ' /K ' & $sRunWait) ; отладка

					 RunWait(@ComSpec & ' /K ' & $sRunWait)
;~ 					 RunWait($sRunWait, '', @SW_HIDE)
;~              Else
;~                  ConsoleWriteError("Extension of file [" & $sSourceFile & "] is [" & $sExt & "] and not in [" & $sPattern & "]" & @CRLF)
;~              EndIf
            Else
                MsgBox(0, '', "File [" & $sSourceFile & "] not found")
            EndIf
        Next

        ProgressSet(100, "Converting complete", "100%")

        Sleep(1000)
        ProgressOff()
    EndIf
Else
    MsgBox(0, "Usage", "Drop file(s) on " & @ScriptName)
    ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
EndIf

Exit (0)
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
все дело в пробелах в пути. тут, как раз, даже двойные кавычки не помогают. только короткий путь
Код:
#include <File.au3>

AutoItSetOption("MustDeclareVars", 1)

Local $i
Local $sSourceFile, $sDestFile, $sDestPath, $sExePath
Local $sDrive, $sFolder, $sFileName, $sExt, $sParams, $sRunWait


If $CmdLine[0] <> 0 Then
	If FileExists("C:\Program Files (x86)\noesis\4231\Noesis.exe") Then
		ProgressOn("Converting", "", "0%")
		For $i = 1 To $CmdLine[0]
			$sSourceFile = $CmdLine[$i]
			ProgressSet(($i / $CmdLine[0]) * 100, $sFileName & $sExt, String(Round($i / $CmdLine[0] * 100, 1)) & "%")
			If FileExists($sSourceFile) Then
				_PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)
				$sExePath = FileGetShortName('C:\Program Files (x86)\noesis\4231\Noesis.exe') & ' ?cmode'
				$sParams = '-fbxexportver FBX201100'
				$sDestFile = '"' & $sDrive & StringTrimRight($sFolder, 1) & '\' & $sFileName & ".fbx" & '"'
				$sSourceFile = '"' & $sSourceFile & '"'
				$sRunWait = $sExePath & " " & $sSourceFile & " " & $sDestFile & " " & $sParams
				RunWait(@ComSpec & ' /c ' & $sRunWait, '', @SW_HIDE)
			Else
				MsgBox(0, '', "File [" & $sSourceFile & "] not found")
			EndIf
		Next
		ProgressSet(100, "Converting complete", "100%")
		Sleep(1000)
		ProgressOff()
	EndIf
Else
	MsgBox(0, "Usage", "Drop file(s) on " & @ScriptName)
	ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
EndIf

Exit (0)
Tosyk, работа со сторонними консольными программами не всегда одинакова, поэтому нужно смотреть каждый случай. а значит тему можно продолжать бесконечно :smile:
вывод - сразу не огорчаться, а внимательно искать ошибку
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
Но в данном конкретном примере с ноезис ведь если не удаётся никак экранировать пробелы в путях то ошибка ли это?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
запускается cmd и в нее передается команда запуска файла с параметрами. в данном случае консоль не поняла пути и выдала ошибку, мол, нет такой команды и тд.


Добавлено:
Сообщение автоматически объединено:

нативная функция Run понимает путь с пробелами и проблемы не возникает. вот вся разница
 
Верх