Что нового

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk [?]
у меня работает, на компе друга говорит No $CmdLine, как исправить?
А друг перетаскивает файлы на скомпилированный скрипт или просто запускает его?

Чтобы проверять форматы, надо их задать в скрипте, но мне не понятно тогда в какой формат надо будет конвертировать.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
CreatoR [?]
Имелось в виду что при компиляций скрипта, nconvert должен находиться рядом со скриптом.
при компиляции программа находилась рядом со скриптом, а вот если её (программу) не положить рядом с скомпилированным exe то работать отказывается

madmasles [?]
А друг перетаскивает файлы на скомпилированный скрипт или просто запускает его?
я дал ему tga файл и скомпилированный скрипт (exe)
EDIT: а кстати, я что то не сказал ему перетащить tga на exe, а сейчас сам зупустил и у меня та же ошибка. как нибудь можно сделать защиту от дурака? чтобы ничего не происходило при запуске


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

p.s.: в общем это конкретный случай, на основе которого я хочу понять принципы, пока всё более-менее понятно
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk,
С разными заданными в скрипте расширениями файлов для конвертации и одним расширением для выходного файла.
Код:
#NoTrayIcon

If Not @Compiled Then
	MsgBox(16, 'Error', 'Надо скомпилировать сначала')
	Exit
EndIf
If Not $CmdLine[0] Then
	MsgBox(16, 'Error', 'No $CmdLine')
	Exit
EndIf
If WinExists(@ScriptName & '{[/@$@\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@$@\]}')

$aFiles = _Get_Files()
If @error Then
	MsgBox(16, 'Error', 'Нет файлов с нужными расширениями')
	Exit
EndIf
$iConvert = _Convert($aFiles)
$iErrorConvert = @error
$iErrorMove = @extended
If $iErrorConvert > 0 Then
	MsgBox(16, 'Error', 'Ошибок конвертации: ' & $iErrorConvert & @LF & 'Успешно конвертировано: ' & _
			$iConvert & @LF & 'Ошибок перемещения: ' & $iErrorMove)
ElseIf $iErrorConvert < 0 Then
	MsgBox(16, 'Error', 'Error')
Else
	MsgBox(64, 'Info', 'Успешно конвертировано: ' & $iConvert & _
			@LF & 'Ошибок перемещения: ' & $iErrorMove)
EndIf

Func _Convert($a_Files)
	Local $s_Ext = 'tga', $s_Nconvert = 'nconvert.exe', $s_TempDir = @ScriptDir & '\_Temp', _
			$i_End, $s_ConvertName, $i_CountErrorConvert = 0, $i_CountSuccess = 0, $i_CountErrorMove = 0
	If Not FileExists($s_TempDir) Then
		If Not DirCreate($s_TempDir) Then Return SetError(-1, 0, 0)
	EndIf
	If Not FileInstall('nconvert.exe', $s_TempDir & '\' & $s_Nconvert, 1) Then Return SetError(-1, 0, 0)
	For $i = 1 To $a_Files[0]
		$i_End = RunWait('"' & $s_TempDir & '\' & $s_Nconvert & '" -overwrite -D -c 1 -out ' & $s_Ext & ' "' & $a_Files[$i] & '"', '', @SW_HIDE)
		If Not $i_End Then
			$i_CountSuccess += 1
			$s_ConvertName = StringRegExpReplace($a_Files[$i], '\.[^.]*$', '.' & $s_Ext)
			If Not FileMove($s_ConvertName, $s_TempDir & '\', 1) Then $i_CountErrorMove += 1
		Else
			$i_CountErrorConvert += 1
		EndIf
	Next
	FileDelete($s_TempDir & '\' & $s_Nconvert)
	Return SetError($i_CountErrorConvert, $i_CountErrorMove, $i_CountSuccess)
EndFunc   ;==>_Convert

Func _Get_Files()
	Local $s_Ext = 'tga|png|jpg|tif', _ ;допустимые расширения, можно задать любые нужные Вам расширения в таком же формате ('ext1|ext2|ext3|ext4' и т.д.)
			$a_Files[$CmdLine[0] + 1], $s_Attrib, $i_Count

	For $i = 1 To $CmdLine[0]
		If StringRegExp($CmdLine[$i], '(?i).+\.(' & $s_Ext & ')$') Then
			$s_Attrib = FileGetAttrib($CmdLine[$i])
			If $s_Attrib And Not StringInStr($s_Attrib, 'D') Then
				$i_Count += 1
				$a_Files[$i_Count] = $CmdLine[$i]
			EndIf
		EndIf
	Next
	If $i_Count Then
		ReDim $a_Files[$i_Count + 1]
		$a_Files[0] = $i_Count
		Return $a_Files
	Else
		SetError(1)
	EndIf
EndFunc   ;==>_Get_Files
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
madmasles
спасибо огромное, скрипт работает!
правда меня смущает массив из сложносочинённых функций с определением типов файлов и осень много отсылок к статистическим сообщениям в теле скрипта
нужно поподробнее разобраться в этом :smile:

а можно сделать так чтобы папка _Temp не была заметна и удалялась так же не заметно? добавляю
Код:
DirRemove ($s_TempDir, 1)

но видно как папка моргает при удалении.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk,
Если Вам не нужна статистика выполнения, уберите ее.
Создавайте временную папку для распаковки nconvert.exe в любом месте (например в @TempDir) или распаковывайте его сразу в @TempDir, а в конце удаляйте.
Пример с перемещением я привел для того, чтобы Вам было понятно как перемещать конвертированные файлы (уже с другим расширением).
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
OffTopic:
madmasles
И всё таки мне немного непонятна ваша склонность реализаций задач наиболее сложным методом :Typing:.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
OffTopic:
madmasles [?]
Ну в данном случае (а я не только про этот случай), можно было бы не писать код для «статистики выполнения» :smile:, оно не требовалось в поставленной задаче.

Я обычно стараюсь строить скрипт так, чтобы потом не оставалось лишних вопросов.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
madmasles [?]
Создавайте временную папку для распаковки nconvert.exe в любом месте (например в @TempDir) или распаковывайте его сразу в @TempDir, а в конце удаляйте.
в этом случае разве скрипт будет работать? я полагал что скрипт распаковывает nconvert в папку с исходным файлом tga и обрабатывает tga, далее удаляет
строки со статистикой пока закоментил, путь к темпу попробую, тему решёной пометил
спасибо! :ok:
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
уж не знаю простят ли модераторы сей вольности
пытаюсь создать похожий скрипт, но с добавлением dll, не работает
удалил $s_TempDir из скрипта, думал в нём дело, но он ни при чём
подскажите что не так:

Код:
#NoTrayIcon

[list type=decimal]
[*]значит имя файла получаем
[*]прогу и длл копируем
[*]run выполняем[/list]
но ничего не выходит (а должно извлечься несколько файлов .dae)

p.s.: выполнение извлечения идёт без дополнительных команд по такой схеме:
Код:
Mafia2ModelDumper.exe ФАЙЛ
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk,
Попробуйте заменить
Код:
;...
$s_MDumper = 'Mafia2ModelDumper.exe'; и так все файлы, которые FileInstall()
;...на
$s_MDumper = @ScriptDir & '\Mafia2ModelDumper.exe'
;... и
RunWait($s_MDumper & '"' & $a_Files[$i] & '"', '', @SW_HIDE);пробела нет
;...на
RunWait('"' & $s_MDumper & '" "' & $a_Files[$i] & '"', '', @SW_HIDE)
;...

PS
А вот здесь Вам статистика выполнения бы и пригодилась. :smile:
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
madmasles [?]
и так все файлы, которые FileInstall()
вы имеете ввиду там где Local?

madmasles [?]
А вот здесь Вам статистика выполнения бы и пригодилась.
я пока стараюсь не забивать мозг а то можно утануть в строках :smile:

сделал как вы посоветовали:
Код:
#NoTrayIcon

почему тут, не пойму
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
madmasles [?]
ошибка в строке 13, коей соответствует вышеупомянутая (error in expression)

при этом распаковывает все 6 запакованных файла в папку с exe
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk,
Вроде, разобрался. Для Mafia2ModelDumper.exe обязательно надо рабочий каталог указывать (второй параметр в Run-RunWait). В него он и распаковывает файлы. Этот каталог должен существовать.
Код:
;...
RunWait('"' & $s_MDumper & '" "' & $a_Files[$i] & '"', @ScriptDir, @SW_HIDE)
;...
Можно создать папку и распаковывать в нее.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
madmasles [?]
Вроде, разобрался.
спасибо, всё отлично работает! сейчас только сделаю чтобы прога и dll'ки работали в системном темпе и порядок.

могу я тему не помечать решённой, ибо иногда вот такие мелочи буду уточнять?

p.s.: для справки, статус бар наверное надо цеплять за @SW_HIDE?

p.p.s.: кстати как сделать чтобы все выделенные файлы конвертировались, а не только тот за который тянем?
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
madmasles [?]
Не понял, какой статус-бар?
тот который показывает % выполнения до завершения :smile:

вот что сейчас важнецки:
как сделать чтобы все выделенные файлы конвертировались, а не только тот за который тянем?
 
Верх