Что нового

[Автоматизация] преобразование файлов с параметрами

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk [?]
как сделать чтобы все выделенные файлы конвертировались, а не только тот за который тянем?
Если при перетаскивании, то выделяете несколько файлов и перетаскиваете их на exe-файл, или Вы хотите по горячей клавише?
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
madmasles [?]
Если при перетаскивании, то выделяете несколько файлов и перетаскиваете их на exe-файл, или Вы хотите по горячей клавише?
в том то и дело: я выделяю несколько файлов, далее тяну за один из выделенных файлов на программу, отпускаю, но конвертируется только тот за который я тяну
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk [?]
я выделяю несколько файлов, далее тяну за один из выделенных файлов на программу, отпускаю, но конвертируется только тот за который я тяну
Ваш код + пару файлов(один у меня есть).
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
madmasles [?]
Ваш код + пару файлов(один у меня есть).
скачать

Код:
#NoTrayIcon

$aFiles = _Get_Files()

_Convert($aFiles)

Func _Convert($a_Files)
    Local $s_Nconvert = 'nconvert.exe', $s_TempDir = @TempDir & '\_TempTex\', $i_End
    If Not FileExists($s_TempDir) Then
        If Not DirCreate($s_TempDir) Then Return SetError(1)
    EndIf
    If Not FileInstall('nconvert.exe', $s_TempDir & '\' & $s_Nconvert, 1) Then Return SetError(1)
    For $i = 1 To $a_Files[0]
        $i_End = RunWait('"' & $s_TempDir & '\' & $s_Nconvert & '" -overwrite -D -c 1 -out tga "' & $a_Files[$i] & '"', '', @SW_HIDE)
        If $i_End Then Return SetError(1)
        ;FileMove($a_Files[$i], $s_TempDir, 1)
		DirRemove ($s_TempDir, 1)
    Next
    FileDelete($s_TempDir & '\' & $s_Nconvert)
EndFunc   ;==>_Convert

Func _Get_Files()
    Local $aFiles[$CmdLine[0] + 1] = [$CmdLine[0]]

    For $i = 1 To $CmdLine[0]
        $aFiles[$i] = $CmdLine[$i]
    Next
    Return $aFiles
EndFunc   ;==>_Get_Files

все файлы после преобразования должны быть чуть меньшего размера (с ~3mb до ~2,9mb)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Tosyk
Смотря на какой элемент перетягиваются файлы. Если Label, то один файл принимается. Для получения множества файлов нужно использовать Input или Edit.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
AZJIO [?]
на какой элемент
в каком смысле элемент? я думаю загвоздка в функции получения файлов: файл получаем, передаём следующей функции, но все выделенные файлы не хотят передаваться. Кидаю файлы на скомпилированный exe'шник
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Tosyk
Попробуй такой скрипт для доказательства
Код:
#include <Array.au3>
_ArrayDisplay($CmdLine, 'Array')
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
AZJIO [?]
Попробуй такой скрипт для доказательства
спасибо, получил массив, только как этот массив вкинуть в _getfiles? а возможно этот array нужно будет использовать в функции исполнения программы? либо прячем array под переменную, а переменную передаём уже в функцию исполнения? пример использования пожалуйста.
надеюсь на madmasles'а, может он подскажет решение :blink:
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Tosyk
Массив параметров является глобальной константой, можешь его использовать в любом месте скрипта. Но чтоб казусов не было с передачей иных параметров, лучше этот массив проверить на валидность путей и передать пути в новый массив, а его уже передавать как параметр функции.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk,
В Вашем скрипте нашел следующие ошибки:
Код:
;1
;...
$s_TempDir = @TempDir & '\_TempTex\' ;лишний слеш в конце(не критично)
;...
;2
;...
        DirRemove ($s_TempDir, 1)
    Next
 ;Вы в первом же цикле удаляете папку с nconvert.exe, второй и далее файлы уже не чем обрабатывать.
;...
Если их устранить, то обрабатываются все файлы.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
madmasles [?]
Если их устранить, то обрабатываются все файлы.
спасибо, всё работает отлично! вот последний вид скрипта:
Код:
#NoTrayIcon

$aFiles = _Get_Files()

_Convert($aFiles)

Func _Convert($a_Files)
    Local $s_Nconvert = 'nconvert.exe', $s_TempDir = @TempDir & '\_TempTex\', $i_End
    If Not FileExists($s_TempDir) Then
        If Not DirCreate($s_TempDir) Then Return SetError(1)
    EndIf
    If Not FileInstall('nconvert.exe', $s_TempDir & '\' & $s_Nconvert, 1) Then Return SetError(1)
    For $i = 1 To $a_Files[0]
        $i_End = RunWait('"' & $s_TempDir & '\' & $s_Nconvert & '" -overwrite -D -c 1 -out tga "' & $a_Files[$i] & '"', '', @SW_HIDE)
        If $i_End Then Return SetError(1)
        ;FileMove($a_Files[$i], $s_TempDir, 1)
	Next
    FileDelete($s_TempDir & '\' & $s_Nconvert)
	DirRemove ($s_TempDir, 1)
EndFunc   ;==>_Convert

Func _Get_Files()
    Local $aFiles[$CmdLine[0] + 1] = [$CmdLine[0]]

    For $i = 1 To $CmdLine[0]
        $aFiles[$i] = $CmdLine[$i]
    Next
    Return $aFiles
EndFunc   ;==>_Get_Files
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
madmasles
сейчас пишу более сложный скрипт преобразования файлов. Он состоит из двух частей:
1. Дампинг файлов. Уже обсуждали тут эту часть и я добился успехов в процессе чтения темы. Вот что проиходит:
Код:
Mafia2ModelDumper.exe ФАЙЛ.РАСШИРЕНИЕ
В качестве РАСШИРЕНИЯ в первом этапе выступает раширение *.sds. В результате получаются несколько файлов *.dae (иногда очень много, несколько сотен). Вот мой скрипт для этого (работает отлично):
Код:
#NoTrayIcon

$aFiles = _Get_Files()

_DumpDae($aFiles)

Func _DumpDae($a_Files)
    Local $s_MDumper = 'Mafia2ModelDumper.exe', $s_Ghelper = 'Gibbed.Helpers.dll', $s_Gillusion = 'Gibbed.Illusion.FileFormats.dll', $s_ICSharp = 'ICSharpCode.SharpZipLib.dll', $s_M2Config = 'Mafia2ModelDumper.exe.config', $s_M2Tool = 'Mafia2Tool.dll', $s_ScriptDir = @ScriptDir, $s_TempDir = @TempDir & '\_TempM2Models', $i_End
    
	If Not FileExists($s_TempDir) Then
        If Not DirCreate($s_TempDir) Then Return SetError(1)
	EndIf
		
    If Not FileInstall('Mafia2ModelDumper.exe', $s_TempDir & '\' & $s_MDumper, 1) Then Return SetError(1)
	If Not FileInstall('Gibbed.Helpers.dll', $s_TempDir & '\' & $s_Ghelper, 1) Then Return SetError(1)
	If Not FileInstall('Gibbed.Illusion.FileFormats.dll', $s_TempDir & '\' & $s_Gillusion, 1) Then Return SetError(1)
	If Not FileInstall('ICSharpCode.SharpZipLib.dll', $s_TempDir & '\' & $s_ICSharp, 1) Then Return SetError(1)
	If Not FileInstall('Mafia2ModelDumper.exe.config', $s_TempDir & '\' & $s_M2Config, 1) Then Return SetError(1)
	If Not FileInstall('Mafia2Tool.dll', $s_TempDir & '\' & $s_M2Tool, 1) Then Return SetError(1)
	
    For $i = 1 To $a_Files[0]
        $i_End = RunWait('"' & $s_TempDir & '\' & $s_MDumper & '" "' & $a_Files[$i] & '"', $s_TempDir, @SW_HIDE)
        If $i_End Then Return SetError(1)
		;FileMove($a_Files[$i], $s_ScriptDir, 1)
		FileMove($s_TempDir & '\' & '*.dae', $s_ScriptDir, 1)
	Next
	;DirRemove ($s_TempDir, 1)
EndFunc   ;==>_DumpDae

Func _Get_Files()
    Local $aFiles[$CmdLine[0] + 1] = [$CmdLine[0]]

    For $i = 1 To $CmdLine[0]
        $aFiles[$i] = $CmdLine[$i]
    Next
    Return $aFiles
EndFunc   ;==>_Get_Files
как видно в процессе участвуют ещё и несколько необходимых dll, выполнение происходит в системном темпе, а далее полученные файлы переносятся в папку со скриптом (для второго этапа учтено что файлы пока что находятся там где происходит дампинг, т.е. в системном темпе). Полученные файлы *.dae являются промежуточными. Они нужны для второго этапа.
2. Конвертирование полученных *.dae. Происходит таким образом:
Код:
mesh2rdm.exe ИСХОДНЫЙ_ФАЙЛ.РАСШИРЕНИЕ КОНЕЧНЫЙ_ФАЙЛ.РАСШИРЕНИЕ -flipuv -scale 100 -nopause -rotate 0 180 0
в качестве РАШИРЕНИЯ может быть любой поддерживаемый тип, в данном примере используется расширение .dae как для исходного так и для конечного файлов.
После конвертирования полученные файлы *.dae имеют почти вдвое уменьшенный размер и должны быть скопированы/перемещены туда где расплагаются изначальные файлы *.sds, которые участвуют в дампинге из первого этапа. Для конвертирования я написал отдельный скрипт, который должен искать файлы по маске (*.dae) в системном темпе и конвертировать их. Но он этого не делает:
Код:
#NoTrayIcon

_Convert()

Func _Convert($a_Files)
    Local $s_M2RDM = 'mesh2rdm.exe', $s_ScriptDir = @ScriptDir, $s_TempDir = @TempDir & '\_TempM2Models', $i_End
    
	If Not FileExists($s_TempDir) Then
        If Not DirCreate($s_TempDir) Then Return SetError(1)
	EndIf

	If Not FileInstall('mesh2rdm.exe', $s_TempDir & '\' & $s_M2RDM, 1) Then Return SetError(1)
	
	For $i = 1 To $a_Files[0]
        $i_End = RunWait('"' & $s_TempDir & '\' & $s_M2RDM & '" "' & $s_TempDir & '\' '*.dae' & $s_ScriptDir & '\' '*.dae' & '" "' & '" -overwrite -D -c 1 -out tga "' & '"', $s_ScriptDir, @SW_HIDE)
        If $i_End Then Return SetError(1)
		;FileMove($a_Files[$i], $s_ScriptDir, 1)
		;FileMove($s_TempDir & '\' & '*.dae', $s_ScriptDir, 1)
	Next
	;DirRemove ($s_TempDir, 1)
EndFunc   ;==>_Convert
В идеале это должен быть один скрипт, в котором есть функции для получения файлов, дампинга файлов, конвертирования файлов и перемещения файлов в исходный каталог.
Загвоздка состоит во втором этапе, в котором не могу понять как снова получить файлы .dae и передать их для конвертирования функции.
 
Верх