Что нового

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

Tosyk

Новичок
Сообщения
206
Репутация
0
Суть: кидаем на прогу (скомпилированный скрипт Autoit) исходный файл или несколько файлов и их начинает обрабатывать встроенная программа (nconvert.exe) таким выражением:

Код:
nconvert.exe -overwrite -D -c 1 -out png "ФАЙЛЫ_ИЛИ_ФАЙЛ"

на выходе получаем файлы output.png в той же папке из которой закидывали source.file

вот что у меня пока получилось из того что я знаю и что у меня есть:

Код:
#NoTrayIcon

$aFiles = _Get_Files()
_Check_ScriptDir()

$aFiles = _Get_Files()
_Convert($aFiles)

Func _Convert($a_File)
    Local $s_nconvert = '"' & @ScriptDir & '\nconvert.exe" ', _
            $s_TempDir = @ScriptDir & '\_Temp\'
    For $i = 1 To $a_File[0][0]
        RunWait($s_nconvert & '"' & $a_File[$i][0] & '"', '', @SW_HIDE)
        FileMove($a_File[$i][0], $s_TempDir, 9)
        EndIf
    Next
EndFunc   ;==>_Convert

Func _Check_ScriptDir()
    Local $s_nconvert = @ScriptDir & '\nconvert.exe'
    If Not FileExists($s_nconvert) Then Exit
EndFunc   ;==>_Check_ScriptDir

Func _Get_Files()
    ...
EndFunc   ;==>_Get_Files


Очевидно, что файл nconvert.exe зашивается в exe при компиляции и вызывается в темп дериктории.
Вообще скоре похоже на "я его слепила из того что было", но всё что написано мне понятно.
У меня такие вопросы:
  • каким образом должна выглядеть функция _Get_Files()?
  • как увязать комманды -overwrite -D -c 1 -out png в скрипт?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tosyk [?]
каким образом должна выглядеть функция _Get_Files()?

Код:
Func _Get_Files()
	Local $aFiles[1]
	
	For $i = 1 To $CmdLine[0]
		If $CmdLine[$i] = "png" Then
			$aFiles[0] += 1
			ReDim $aFiles[$aFiles[0] + 1]
			$aFiles[$aFiles[0]] = $CmdLine[$i]
		EndIf
	Next
    
	Return $aFiles
EndFunc

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

как увязать комманды -overwrite -D -c 1 -out png в скрипт?
В смысле, что значит „увязать“?
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
CreatoR [?]
В смысле, что значит „увязать“?
т.е. как внедрить в скрипт эти команды?

я так понимаю в эту строку:
Код:
RunWait($s_nconvert & '"' & $a_File[$i][0] & '"', '', @SW_HIDE)

но как?

вот так?:
Код:
RunWait($s_nconvert & '-overwrite -D -c 1 -out png' & $a_File[$i][0] & '"', '', @SW_HIDE)


спасибо за функцию
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tosyk [?]
Почти:
Код:
RunWait($s_nconvert & ' -overwrite -D -c 1 -out png "' & $aFiles[$i] & '"', '', @SW_HIDE)

и в таком случае функция «_Get_Files» должна быть немного другой:

Код:
Func _Get_Files()
    Local $aFiles[$CmdLine[0] + 1] = [$CmdLine[0]]
    
    For $i = 1 To $CmdLine[0]
        $aFiles[$i] = $CmdLine[$i]
    Next
    
    Return $aFiles
EndFunc
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
странно, не работает.

компилю в texture_01.exe
запускаю cmd:
Код:
texture_01.exe sample_01.tga
и ничего

пробую бросить sample_01.tga на texture_01.exe и ничего

должно произойти преобразование файла

sample_01.tga и texture_01.exe в одной папке

вот полный скрипт:
Код:
#NoTrayIcon

$aFiles = _Get_Files()
_Check_ScriptDir()

$aFiles = _Get_Files()
_Convert($aFiles)

Func _Convert($a_File)
    Local $s_nconvert = '"' & @ScriptDir & '\nconvert.exe" ', _
            $s_TempDir = @ScriptDir & '\_Temp\'
    For $i = 1 To $a_File[0][0]
        RunWait($s_nconvert & ' -overwrite -D -c 1 -out tga "' & $aFiles[$i] & '"', '', @SW_HIDE)
        FileMove($a_File[$i][0], $s_TempDir, 9)
	Next
EndFunc   ;==>_Convert

Func _Check_ScriptDir()
    Local $s_nconvert = @ScriptDir & '\nconvert.exe'
    If Not FileExists($s_nconvert) Then Exit
EndFunc   ;==>_Check_ScriptDir

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


там в команде скрипта png исправил на tga, так правильно, первый раз ошибся
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tosyk [?]
вот полный скрипт
Мне немного непонятно, почему используется двумерный массив, когда _Get_Files возвращает одномерный? :scratch:

Код:
#NoTrayIcon

$aFiles = _Get_Files()

_Check_ScriptDir()
_Convert($aFiles)

Func _Convert($aFiles)
    Local $s_nconvert = '"' & @ScriptDir & '\nconvert.exe"', $s_TempDir = @ScriptDir & '\_Temp\'
    
	For $i = 1 To $aFiles[0]
        RunWait($s_nconvert & ' -overwrite -D -c 1 -out tga "' & $aFiles[$i] & '"', '', @SW_HIDE)
        FileMove($aFiles[$i], $s_TempDir, 9)
    Next
EndFunc   ;==>_Convert

Func _Check_ScriptDir()
    Local $s_nconvert = @ScriptDir & '\nconvert.exe'
    If Not FileExists($s_nconvert) Or $CmdLine[0] = 0 Then Exit
EndFunc   ;==>_Check_ScriptDir

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
CreatoR [?]
Мне немного непонятно, почему используется двумерный массив, когда _Get_Files возвращает одномерный?
это потому что взял кусок из примера в котором участвовало 2 программы

при компиляции программа не работает.
работает только если поместить nconvert.exe в папку с .exe (nconvert.exe не записывается внутрь?, какой командой можно записать?)

это решил закоментив строку 13:
Код:
и что странно при этом создаётся папка _Temp и туда записывается преобразованный файл
 

beliy

Продвинутый
Сообщения
372
Репутация
72
работает только если поместить nconvert.exe в папку с .exe
потому что в скрипте указан путь рядом с скриптом
Код:
$s_nconvert = @ScriptDir & '\nconvert.exe'

nconvert.exe не записывается внутрь?, какой командой можно записать?
посмотри в справке о функции FileInstall
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
beliy [?]
потому что в скрипте указан путь рядом с скриптом
да, понятно

посмотри в справке о функции FileInstall
т.е. нужно сначала записать в папку где скрипт будет видеть этот файл, а потом удалить его?

типа того?:

Код:
Func _Convert($aFiles)
    Local $s_nconvert = '"' & @ScriptDir & '\nconvert.exe"', $s_TempDir = @ScriptDir & '\_Temp\'
    
    For $i = 1 To $aFiles[0]
        FileInstall('nconvert.exe', @ScriptDir & '\')
        RunWait($s_nconvert & ' -overwrite -D -c 1 -out tga "' & $aFiles[$i] & '"', '', @SW_HIDE)
        ;FileMove($aFiles[$i], $s_TempDir, 9)
    Next
EndFunc   ;==>_Convert


EDIT: проверил, файл записывается в exe при компиляции FileInstall(), но этот exe не преобразовывает файлы, подскажите куда эту функцию вставить
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk,
Попробуйте так. При запуске из SciTE и при компиляции файл nconvert.exe должен лежать рядом со скриптом.
Код:
Func _Convert($a_Files)
	Local $s_Nconvert = 'nconvert.exe', $s_TempDir = @ScriptDir & '\_Temp\', $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)
EndFunc   ;==>_Convert

PS
ИМХО, лучше запускать через Run() и читать то, что nconvert.exe в консоли пишет.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
madmasles
сделал так, не работает:
кидаю файл на скомпилированный exe, но ничего не происходит
кстати даже при наличии nconvert.exe рядом с скомпилированным скриптом .tga файл не обрабатывается

вот полный скрипт, который есть сейчас:
Код:
#NoTrayIcon

If Not @Compiled Then Exit

If WinExists(@ScriptName & '{[/@$@\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@$@\]}')

If Not $CmdLine[0] Then Exit

$aFiles = _Get_Files()

_Check_ScriptDir()
If @error Then Exit
_Convert($aFiles)

Func _Convert($aFiles)
    Local $s_nconvert = '"' & @ScriptDir & '\nconvert.exe"', $s_TempDir = @ScriptDir & '\_Temp\'
    If Not FileInstall('nconvert.exe', $s_nconvert) Then Return SetError(1, 0, 0)
    For $i = 1 To $aFiles[0]
        RunWait($s_nconvert & ' -overwrite -D -c 1 -out tga "' & $aFiles[$i] & '"', '', @SW_HIDE)
        ;FileMove($aFiles[$i], $s_TempDir, 9)
    Next
    FileDelete($s_nconvert)
    Return 1
EndFunc   ;==>_Convert

Func _Check_ScriptDir()
	Local $s_nconvert = @ScriptDir & '\nconvert.exe'
    If Not FileExists($s_nconvert) Or $CmdLine[0] = 0 Then Exit
EndFunc   ;==>_Check_ScriptDir

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
вот файлы
визуально обработанные файлы отличаются от исходных только размером (исходные ~3 мб, обработанные ~2,9мб), применяется сжатие
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk,
А как Вы nconvert.exe bat-файлом запускаете?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk,
С Вашим nconvert.exe у меня не работало, скачал новый nconvert.exe, все работает. Я код выше поменял.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk
Так у меня работает с новым nconvert.exe. А не надо проверять форматы перетаскиваемых файлов?
Код:
#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()

_Convert($aFiles)
If @error Then
	MsgBox(16, 'Error', '_Convert')
Else
	MsgBox(64, 'Info', 'OK')
EndIf
Func _Convert($a_Files)
	Local $s_Nconvert = 'nconvert.exe', $s_TempDir = @ScriptDir & '\_Temp\', $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)
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
спасибо, без функции чека работает, немного модифицировал скрипт:
закоментил строки:
Код:
If @error Then
    MsgBox(16, 'Error', '_Convert')
Else
    MsgBox(64, 'Info', 'OK')
EndIf

и
Код:
FileMove($a_Files[$i], $s_TempDir, 1)


FileMove оставил в скрипте чтобы не потерять, пригодится

а также добавил
Код:
DirRemove ($s_TempDir, 1)


у меня работает, на компе друга говорит No $CmdLine, как исправить?

madmasles [?]
А не надо проверять форматы перетаскиваемых файлов?
думаю это было бы очень полезным!
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Tosyk [?]
кстати даже при наличии nconvert.exe рядом с скомпилированным скриптом .tga файл не обрабатывается
Имелось в виду что при компиляций скрипта, nconvert должен находиться рядом со скриптом.
 
Верх