Что нового

[Автоматизация] Комплексное преобразование файлов, двумя программами последовательно

Tosyk

Новичок
Сообщения
194
Репутация
0
сейчас пишу более сложный скрипт преобразования файлов. Он состоит из двух частей:
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 и передать их для конвертирования функции.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Tosyk,
Попробуйте сначала получить файлы dae в массив, а потом их по очереди конвертировать.
Код:
;...
$sDir = @TempDir & '\_TempM2Models' ;папка, в которую ранее файлы распаковали
$aFileDae = _FileSearch($sDir, '*.dae', 1)
If Not @error Then
	_Convert($aFileDae);в функции пути поменяйте 
	ConsoleWrite(@error & @LF)
EndIf

;CreatoR, http://autoit-script.ru/index.php/topic,8266.msg55775
Func _FileSearch($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
	Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib, $sFiles

	If Not StringInStr(FileGetAttrib($sPath), "D") Then
		Return SetError(1, 0, 0)
	EndIf
	If $iSubDir = 1 Then
		$sAttrib &= ' /S'
	EndIf
	If $iSort = 1 Then
		$sAttrib &= ' /O:N'
	EndIf
	Switch $iFlag
		Case 1
			$sAttrib &= ' /A-D'
		Case 2
			$sAttrib &= ' /AD'
		Case Else
			$sAttrib &= ' /A'
	EndSwitch
	$sOut = StringToBinary('0' & @CRLF, 2)
	$sPath = StringRegExpReplace($sPath, '\\+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
	$aMasks = StringSplit($sFileMask, ';')
	For $i = 1 To $aMasks[0]
		If StringStripWS($aMasks[$i], 8) = "" Then
			ContinueLoop
		EndIf
		$sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'

		If $i < $aMasks[0] Then
			$sFiles &= ';'
		EndIf
	Next
	$hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
	While 1
		$sRead = StdoutRead($hDir, False, True)
		If @error Then
			ExitLoop
		EndIf
		If $sRead <> "" Then
			$sOut &= $sRead
		EndIf
	WEnd
	$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
	If @error Or UBound($aOut) < 2 Then
		Return SetError(2, 0, 0)
	EndIf
	$aOut[0] = UBound($aOut) - 1
	Return $aOut
EndFunc   ;==>_FileSearch

Имена распакованных файлов можно получить заранее при распаковке Mafia2ModelDumper.exe - он их в консоль пишет.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
194
Репутация
0
madmasles
спасибо, как я понимаю этот кусок вставляется после моего первого скрипта, но я понял только строчек 9. Можно ли как то упростить скрипт? Я правда хочу научиться, не могу же я просить объяснить мне каждую строку!

В вашем скрипте не увидел такой строчки:
Код:
mesh2rdm.exe ИСХОДНЫЙ_ФАЙЛ.РАСШИРЕНИЕ КОНЕЧНЫЙ_ФАЙЛ.РАСШИРЕНИЕ -flipuv -scale 100 -nopause -rotate 0 180 0
и если файлы будут всегда находиться по одному пути, в данном случае
Код:
@TempDir & '\_TempM2Models'

то ну правда для чего такие сложности?
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
194
Репутация
0
Помогите пожалуйста со скриптом.
 

EqKeeper

Новичок
Сообщения
29
Репутация
1
Очень много букв и отсутствие желания писать за тебя скрипт удерживают от "идеального варианта". Впрочем, учитывая, что ты осилил дампинг, думаю, совместить пару скриптов тебе будет не сложно. И если проблема стоит только в поиске файлов, то вот, держи и наслаждайся:
Код:
; ========================================================================================
; Возвращает список файлов / папок в указанном каталоге, отвечающих переданным параметрам
; ----------------------------------------------------------------------------------------
; root - корневой каталог поиска, н.п. C:\Windows
; masks - маски для поиска, разделенные ;
; type - что ищем: 0 - файлы и папки, 1 - только файлы, 2 - только папки
; recurse - если true, поиск также будет проведен в подкатологах
; filereg_exclude - регулярные выражения, резделенные ;, совпадающие с ними имена файлов будут исключены из списка
; folders_exlcude - имена каталогов, в которых не будет проводиться поиск
; fullpath - если true в итоговом массиве будут храниться полные пути файлов, иначе - только имена
; ----------------------------------------------------------------------------------------
; Возвращает: $array[0] - количество найденных файлов
;             $array[1...n] - файл\папка
;===============================================================================
Func GetFileList($root, $masks = "*.*", $type = 0, $recurse = False, $filereg_exclude = "", $folders_exlcude = "", $fullpath = True)

    ; Убираем все слеши в конце пути и добавляем 1, правильный
    $root = StringRegExpReplace($root, "[\\/]+\z", "") & "\"

	; Проверяем существует ли путь
	If Not FileExists($root) Then Return SetError(1, 1, 0)

	; Проверяем маски на наличие недопустимых символов, убираем пробелы между разделителями
    If StringRegExp($masks, "[/:><\|]") Then Return SetError(2, 2, 0)

	; Удаляем пробелы между разделителями и дублирующиеся разделители
	$masks = StringRegExpReplace($masks, "\s*;\s*", ";")
	$masks = StringRegExpReplace($masks, ";{2,}", ";")
    If StringStripWS($masks, 8) = "" Then Return SetError(2, 2, 0)

	; Коррекция параметров
    If $type == 1 Then
		$type = ":-d"
	ElseIf $type == 2 Then
		$type = ":D"
	Else
		$type = ""
	EndIf

	If $recurse Then
		$recurse = "/s "
	Else
		$recurse = ""
	EndIf

    ; Собираем строку поиска
    Local $masks_array = StringSplit($masks, ";"), $find_string = ""
    For $i = 1 To $masks_array[0]
        If StringRegExp($masks_array[$i], "^\..*?\..*?\z") Then
            $masks_array[$i] &= "*" & $masks_array[$i]
        EndIf
        $find_string &= '"' & $root & $masks_array[$i] & '" '
    Next
    $find_string = StringTrimRight($find_string, 1) ; Удаляем последний пробел
    If $find_string = "" Then $find_string = '"' & $root & '*.*"'

	; Запуск поиска и формирование списка файлов
	$cmd_result = ""
	$pid = Run(@ComSpec & " /c dir /b " & $recurse & "/a" & $type & " " & $find_string, "", @SW_HIDE, 4 + 2)
	While 1
        $stdout = StdoutRead($pid)
        If @error Then ExitLoop
        $cmd_result &= _WinAPI_OemToChar($stdout)
    WEnd
	$cmd_result = StringRegExpReplace($cmd_result, "\v+\z", "")
    If Not $cmd_result Then Return SetError(4, 4, 0)

    Local $a_fsplit = StringSplit(StringStripCR($cmd_result), @LF), $s_hold_ret

    For $i = 1 To $a_fsplit[0]
        If StringRegExp($a_fsplit[$i], "^[\wА-Яа-я]:[\\/]+") = 0 Then $a_fsplit[$i] = $root & $a_fsplit[$i]
        If $fullpath Then
            $s_hold_ret &= $a_fsplit[$i] & Chr(1)
        Else
            $s_hold_ret &= StringRegExpReplace($a_fsplit[$i], "((?:.*?[\\/]+)*)(.*?\z)", "$2") & Chr(1)
        EndIf
    Next

    If $s_hold_ret = "" Then Return SetError(5, 5, 0)
	$result = StringSplit($s_hold_ret, Chr(1))

	; Удаляем из списка файлов те, в путях которых присутствуют папки из массива
	If $folders_exlcude Then
		$fes = StringSplit($folders_exlcude, ";")
		If IsArray($fes) Then
			For $i = 1 to $fes[0]
				If $i > $fes[0] Then ExitLoop
				If $fes[$i] == "" Then
					_ArrayDelete($fes, $i)
					$fes[0] = $fes[0] - 1
					$i = $i - 1
				EndIf
			Next
			For $i = 1 to $result[0]
				If $i > $result[0] Then ExitLoop
				$path = StringRegExp($result[$i], "(.*)\\[^\\]*$", 1)
				If $path == 0 Then ContinueLoop
				For $n = 1 to $fes[0]
					If (StringInStr($result[$i], $fes[$n])) Then
						_ArrayDelete($result, $i)
						$result[0] = $result[0] - 1
						$i = $i - 1
						ExitLoop
					EndIf
				Next
			Next
		EndIf
	EndIf

	; Удаляем из списка файлов те, имена которых не соответствуют регулярным выражениям
	If $filereg_exclude Then
		$fes = StringSplit($filereg_exclude, ";")
		If IsArray($fes) Then
			For $i = 1 to $fes[0]
				If $i > $fes[0] Then ExitLoop
				If $fes[$i] == "" Then
					_ArrayDelete($fes, $i)
					$fes[0] = $fes[0] - 1
					$i = $i - 1
				EndIf
			Next
			For $i = 1 to $result[0]
				If $i > $result[0] Then ExitLoop
				$filename = StringRegExp($result[$i], "\\([^\\]+)$", 1)
				If $filename == 0 Then ContinueLoop
				For $n = 1 to $fes[0]
					If ((StringRegExp($filename[0], $fes[$n]) == 1)) Then
						_ArrayDelete($result, $i)
						$result[0] = $result[0] - 1
						$i = $i - 1
						ExitLoop
					EndIf
				Next
			Next
		EndIf
	EndIf

	; Удаляем последний, пустой элемент из результатов поиска
	If ($result[0] > 0) And $result[$result[0]] == "" Then
		_ArrayDelete($result, $result[0])
		$result[0] = $result[0] - 1
	EndIf

	; Возвращаем массив найденных файлов\папок
    Return $result
EndFunc


Можешь кинуть в свой скрипт, можешь в отдельный файл и подцепить include'ом.

Для поиска файлов в своем скрипте пишешь:
Код:
$files = GetFileList(@TempDir, "*.dae", 1) ; получишь массив всех файлов

В нулевом элементе массива - количество файлов
Далее в цикле перебираешь их и делаешь что тебе хочется. Для переноса на прежнее место, соответственно выделяешь из имени исходного файла полный путь к папке, из имени dae-файлов - только имя с расширением. Совмещаешь, получаешь новое имя файлов. А дальше стандартным FileMove($files, $newFileName) переносишь.

Для разбора имени рекомендую использовать скрипт CreatoR'а:
Код:
; ========================================================================================
; Автор: G.Sandler a.k.a CreatoR (MsCreatoR) - Thanks to amel27 for help with RegExp
; Возвращает список файлов / папок в указанном каталоге, отвечающих переданным параметрам
; ----------------------------------------------------------------------------------------
; Function Name:    PathSplit()
; Description:      Split the path to 8 elements.
; Parameter(s):     $path - Path to split.
; Requirement(s):
; Return Value(s):  On seccess - Array $retArray that contain 8 elements:
;                   $retArray[0] = Full path ($path)
;                   $retArray[1] = Drive letter
;                   $retArray[2] = Path without FileName and extension
;                   $retArray[3] = Full path without File Extension
;                   $retArray[4] = Full path without drive letter
;                   $retArray[5] = FileName and extension
;                   $retArray[6] = Just Filename
;                   $retArray[7] = Just Extension of a file
;
;                   On failure - If $path not include correct path (the path is not splitable),
;                   then $path returned.
;                   If $path not include needed delimiters, or it's emty,
;                   then @error set to 1, and returned -1.
; ========================================================================================
Func PathSplit($path)
	If $path = "" Or (StringInStr($path, "\") And StringInStr($path, "/")) Then	Return SetError(1, 0, -1)

    Local $retArray[8], $delim = ""

    If StringRegExp($path, '^(?i)([A-Z]:|\\)(\\[^\\]+)+$') Then $delim = "\"
    If StringRegExp($path, '(?i)(^.*:/)(/[^/]+)+$') Then $delim = "//"

    If $delim = "" Then $delim = "/"
    If Not StringInStr($path, $delim) Then Return $path

    If $delim = "\" Then $delim &= "\"

    $retArray[0] = $path ;Full path
    $retArray[1] = StringRegExpReplace($path,  $delim & '.*', $delim) ;Drive letter
    $retArray[2] = StringRegExpReplace($path, $delim & '[^' & $delim & ']*$', '') ;Path without FileName and extension
    $retArray[3] = StringRegExpReplace($path, '\.[^.]*$', '') ;Full path without File Extension
    $retArray[4] = StringRegExpReplace($path, '(?i)([A-Z]:' & $delim & ')', '') ;Full path without drive letter
    $retArray[5] = StringRegExpReplace($path, '^.*' & $delim, '') ;FileName and extension
    $retArray[6] = StringRegExpReplace($path, '.*' & $delim & '|\.[^.]*$', '') ;Just Filename
    $retArray[7] = StringRegExpReplace($path, '^.*\.', '') ;Just Extension of a file
	Return $retArray
EndFunc


Надеюсь, что помог.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Tosyk,
Рабочий скрипт:
Код:
Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $sUtilitiesDir = @TempDir & '\Utilities', _ ;папка для утилит
		$sWorkDir = @TempDir & '\_Temp', _ ;папка, в которую распаковываем файлы
		$sSourceDir, _;папка, в которую перемещаем обработанные файлы.
		$aFiles

OnAutoItExitRegister('_Exit')

If Not @Compiled Then
	MsgBox(16, 'Error', 'Only compiled')
	Exit
EndIf
If Not $CmdLine[0] Then
	MsgBox(16, 'Error', 'No $CmdLine')
	Exit
EndIf

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

_Start()
If @error Then
	MsgBox(16, 'Error', '_Start')
	Exit
EndIf

$aFiles = _Get_Files()
_DumpDae($aFiles)
ConsoleWrite('Errors _DumpDae: ' & @extended & @LF)
_ConvertM2RDM($sWorkDir, $sSourceDir)
ConsoleWrite('Errors _ConvertM2RDM: ' & @extended & @LF)

Func _DumpDae($a_Files)
	Local $s_MDumper = '"' & $sUtilitiesDir & '\Mafia2ModelDumper.exe"', $i_End, $i_Errors

	For $i = 1 To $a_Files[0]
		$i_End = RunWait($s_MDumper & ' "' & $a_Files[$i] & '"', $sWorkDir, @SW_HIDE)
		If $i_End Then $i_Errors += 1
	Next
	Return SetExtended($i_Errors)
EndFunc   ;==>_DumpDae

Func _ConvertM2RDM($s_PathFrom, $s_PathTo, $s_Mask = '*.dae')
	Local $s_M2RDM = '"' & $sUtilitiesDir & '\mesh2rdm.exe"', $h_Search, $s_File, $i_End, $i_Errors

	If Not StringInStr(FileGetAttrib($s_PathFrom), 'D') Then Return SetError(1)
	If Not StringInStr(FileGetAttrib($s_PathTo), 'D') Then Return SetError(1)
	$s_PathFrom &= '\'
	$s_PathTo &= '\'
	$h_Search = FileFindFirstFile($s_PathFrom & $s_Mask)
	If @error Then Return SetError(1)
	While 1
		$s_File = FileFindNextFile($h_Search)
		If @error Then ExitLoop
		$i_End = RunWait($s_M2RDM & ' "' & $s_PathFrom & $s_File & '" "' & $s_PathTo & $s_File & '" -flipuv -scale 100 -nopause -rotate 0 180 0', '', @SW_HIDE)
		If $i_End Then $i_Errors += 1
	WEnd
	FileClose($h_Search)
	Return SetExtended($i_Errors)
EndFunc   ;==>_ConvertM2RDM


Func _Get_Files()
	Local $a_Files[$CmdLine[0] + 1] = [$CmdLine[0]], $i_Count

	For $i = 1 To $CmdLine[0]
		If FileExists($CmdLine[$i]) Then
			$i_Count += 1
			$a_Files[$i_Count] = $CmdLine[$i]
		EndIf
	Next
	If $i_Count Then
		ReDim $a_Files[$i_Count + 1]
		$a_Files[0] = $i_Count
		$sSourceDir = StringRegExpReplace($a_Files[$a_Files[0]], '\\[^\\]*$', '');определяем исходную папку
		Return $a_Files
	Else
		MsgBox(16, 'Error', 'No files')
		Exit
	EndIf
EndFunc   ;==>_Get_Files

Func _Start()
	If Not FileExists($sUtilitiesDir) Then
		If Not DirCreate($sUtilitiesDir) Then Return SetError(1)
	EndIf
	If Not FileExists($sWorkDir) Then
		If Not DirCreate($sWorkDir) Then Return SetError(1)
	EndIf
	If Not FileInstall('Mafia2ModelDumper.exe', $sUtilitiesDir & '\Mafia2ModelDumper.exe', 1) Then Return SetError(1)
	If Not FileInstall('Gibbed.Helpers.dll', $sUtilitiesDir & '\Gibbed.Helpers.dll', 1) Then Return SetError(1)
	If Not FileInstall('Gibbed.Illusion.FileFormats.dll', $sUtilitiesDir & '\Gibbed.Illusion.FileFormats.dll', 1) Then Return SetError(1)
	If Not FileInstall('ICSharpCode.SharpZipLib.dll', $sUtilitiesDir & '\ICSharpCode.SharpZipLib.dll', 1) Then Return SetError(1)
	If Not FileInstall('Mafia2ModelDumper.exe.config', $sUtilitiesDir & '\Mafia2ModelDumper.exe.config', 1) Then Return SetError(1)
	If Not FileInstall('Mafia2Tool.dll', $sUtilitiesDir & '\Mafia2Tool.dll', 1) Then Return SetError(1)
	If Not FileInstall('mesh2rdm.exe', $sUtilitiesDir & '\mesh2rdm.exe', 1) Then Return SetError(1)
EndFunc   ;==>_Start

Func _Exit()
	If ProcessExists('Mafia2ModelDumper.exe') Then ProcessClose('Mafia2ModelDumper.exe')
	If ProcessExists('mesh2rdm.exe') Then ProcessClose('mesh2rdm.exe')
	DirRemove($sUtilitiesDir, 1)
	DirRemove($sWorkDir, 1)
EndFunc   ;==>_Exit
ИМХО, было бы удобнее сделать так, чтобы перетаскивать на exe можно было не только файлы, но и папку(папки).
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
194
Репутация
0
EqKeeper
спасибо, но способ громоздкий
madmasles
огромное спасибо, всё отлично работает, в скрипте разобрался на 90%, далее буду искать следующее:
1 - запуск exe скрипта и обработка всех файлов по маске вглубь
2 - прогресс бар

madmasles [?]
ИМХО, было бы удобнее сделать так, чтобы перетаскивать на exe можно было не только файлы, но и папку(папки).
думаю это лучший из вариантов обработки
по первому пункту
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Tosyk,
Перетаскивать на exe можно и файлы, и папки. У меня работает.
Код:
Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $sUtilitiesDir = @TempDir & '\Utilities', _ ;папка для утилит
		$sWorkDir = @TempDir & '\_Temp', _ ;папка, в которую распаковываем файлы
		$sSourceDir, _;папка, в которую перемещаем обработанные файлы.
		$aFiles, $iCountDae

OnAutoItExitRegister('_Exit')

If Not @Compiled Then
	MsgBox(16, 'Error', 'Only compiled')
	Exit
EndIf
If Not $CmdLine[0] Then
	MsgBox(16, 'Error', 'No $CmdLine')
	Exit
EndIf

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

_Start()
If @error Then
	MsgBox(16, 'Error', '_Start')
	Exit
EndIf
ToolTip('Поиск файлов', 0, 0)
Sleep(1000) ;паузы здесь и далее только для того, чтобы увидеть ToolTip
_Get_Files($aFiles, $sSourceDir)
ToolTip('Найдено файлов: ' & $aFiles[0], 0, 0)
Sleep(2000)
ToolTip('Распаковка файлов', 0, 0)
_DumpDae($aFiles)
If @error Then
	MsgBox(16, 'Error', '_DumpDae')
	Exit
EndIf
If @extended Then
	MsgBox(16, 'Error', 'No unpack files: ' & @extended)
EndIf
Sleep(1000)
ToolTip('Конвертация и перемещение файлов', 0, 0)
$iCountDae = _ConvertM2RDM($aFiles)
MsgBox(64, 'Info', 'Convert files: ' & $iCountDae & @LF & 'Error convert files: ' & @extended)

Func _DumpDae(ByRef $a_Files)
	Local $s_MDumper = '"' & $sUtilitiesDir & '\Mafia2ModelDumper.exe"', _
			$i_End, $i_Errors, $s_UnPackDir, $s_DirString = '|'

	For $i = 1 To $a_Files[0]
		$s_UnPackDir = StringRegExpReplace($a_Files[$i], '\\[^\\]*$', '')
		$s_UnPackDir = StringReplace($s_UnPackDir, $sSourceDir, $sWorkDir)
		If Not StringInStr($s_DirString, '|' & $s_UnPackDir & '|') Then
			$s_DirString &= $s_UnPackDir & '|'
		EndIf
		If Not FileExists($s_UnPackDir) Then
			If Not DirCreate($s_UnPackDir) Then
				$a_Files[$i] = ''
				ContinueLoop
			EndIf
		EndIf
		$i_End = RunWait($s_MDumper & ' "' & $a_Files[$i] & '"', $s_UnPackDir, @SW_HIDE)
		If $i_End Then
			$i_Errors += 1
			$a_Files[$i] = ''
		Else
			$a_Files[$i] = $s_UnPackDir
		EndIf
		ToolTip('Распаковано файлов ' & $i - $i_Errors & ' из ' & $a_Files[0], 0, 0)
	Next
	If $i_Errors = $a_Files[0] Then
		Return SetError($i_Errors, 0, 0)
	EndIf
	$a_Files = StringSplit(StringTrimRight(StringTrimLeft($s_DirString, 1), 1), '|')
	Return SetExtended($i_Errors, 0)
EndFunc   ;==>_DumpDae

Func _ConvertM2RDM($a_Files, $s_Mask = '*.dae')
	Local $s_M2RDM = '"' & $sUtilitiesDir & '\mesh2rdm.exe"', $h_Search, $s_File, $i_End, $i_Errors, _
			$s_PathTo, $i_Count

	For $i = 1 To $a_Files[0]
		If Not $a_Files[$i] Then ContinueLoop
		$s_PathTo = StringReplace($a_Files[$i], $sWorkDir, $sSourceDir)
		$h_Search = FileFindFirstFile($a_Files[$i] & '\' & $s_Mask)
		If @error Then ContinueLoop
		While 1
			$s_File = FileFindNextFile($h_Search)
			If @error Then ExitLoop
			$i_End = RunWait($s_M2RDM & ' "' & $a_Files[$i] & '\' & $s_File & '" "' & $s_PathTo & '\' & _
					$s_File & '" -flipuv -scale 100 -nopause -rotate 0 180 0', '', @SW_HIDE)
			If $i_End Then
				$i_Errors += 1
			Else
				$i_Count += 1
			EndIf
			ToolTip('Конвертировано и перемещено файлов: ' & $i_Count, 0, 0)
		WEnd
		FileClose($h_Search)
	Next
	Return SetExtended($i_Errors, $i_Count)
EndFunc   ;==>_ConvertM2RDM

Func _Get_Files(ByRef $a_Files, ByRef $s_SourceDir, $s_Mask = 'sds')
	Local $i_Count, $a_Temp
	$a_Files = 0
	$s_SourceDir = 0
	Dim $a_Files[1001] = [1000]
	For $i = 1 To $CmdLine[0]
		If Not FileExists($CmdLine[$i]) Then ContinueLoop
		If Not $s_SourceDir Then
			$s_SourceDir = StringRegExpReplace($CmdLine[$i], '\\[^\\]*$', '')
		EndIf
		If StringInStr(FileGetAttrib($CmdLine[$i]), 'D') Then
			$a_Temp = _FileSearch($CmdLine[$i], '*.' & $s_Mask, 1)
			If @error Then ContinueLoop
			If $i_Count + $a_Temp[0] >= $a_Files[0] Then
				While ($i_Count + $a_Temp[0]) >= $a_Files[0]
					ReDim $a_Files[$a_Files[0] + 1001]
					$a_Files[0] += 1000
				WEnd
			EndIf
			For $j = 1 To $a_Temp[0]
				$a_Files[$i_Count + $j] = $a_Temp[$j]
			Next
			$i_Count += $a_Temp[0]
		Else
			If Not StringRegExp($CmdLine[$i], '(?i).+\.(' & $s_Mask & ')$') Then ContinueLoop
			$i_Count += 1
			If $i_Count >= $a_Files[0] Then
				ReDim $a_Files[$a_Files[0] + 1001]
				$a_Files[0] += 1000
			EndIf
			$a_Files[$i_Count] = $CmdLine[$i]
		EndIf
	Next
	If $i_Count Then
		ReDim $a_Files[$i_Count + 1]
		$a_Files[0] = $i_Count
		Return $a_Files
	Else
		MsgBox(16, 'Error', 'No files')
		Exit
	EndIf
EndFunc   ;==>_Get_Files

Func _Start()
	If Not FileExists($sUtilitiesDir) Then
		If Not DirCreate($sUtilitiesDir) Then Return SetError(1)
	EndIf
	If Not FileExists($sWorkDir) Then
		If Not DirCreate($sWorkDir) Then Return SetError(1)
	EndIf
	If Not FileInstall('Mafia2ModelDumper.exe', $sUtilitiesDir & '\Mafia2ModelDumper.exe', 1) Then Return SetError(1)
	If Not FileInstall('Gibbed.Helpers.dll', $sUtilitiesDir & '\Gibbed.Helpers.dll', 1) Then Return SetError(1)
	If Not FileInstall('Gibbed.Illusion.FileFormats.dll', $sUtilitiesDir & '\Gibbed.Illusion.FileFormats.dll', 1) Then Return SetError(1)
	If Not FileInstall('ICSharpCode.SharpZipLib.dll', $sUtilitiesDir & '\ICSharpCode.SharpZipLib.dll', 1) Then Return SetError(1)
	If Not FileInstall('Mafia2ModelDumper.exe.config', $sUtilitiesDir & '\Mafia2ModelDumper.exe.config', 1) Then Return SetError(1)
	If Not FileInstall('Mafia2Tool.dll', $sUtilitiesDir & '\Mafia2Tool.dll', 1) Then Return SetError(1)
	If Not FileInstall('mesh2rdm.exe', $sUtilitiesDir & '\mesh2rdm.exe', 1) Then Return SetError(1)
EndFunc   ;==>_Start

Func _Exit()
	If ProcessExists('Mafia2ModelDumper.exe') Then ProcessClose('Mafia2ModelDumper.exe')
	If ProcessExists('mesh2rdm.exe') Then ProcessClose('mesh2rdm.exe')
	DirRemove($sUtilitiesDir, 1)
	DirRemove($sWorkDir, 1)
EndFunc   ;==>_Exit

Func _FileSearch($sPath, $sFileMask = '*', $iFlag = 0, $iSubDir = 1, $iSort = 0)
	;CreatoR; http://autoit-script.ru/index.php/topic,8266.msg55775
	Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib, $sFiles, $aMasks

	If Not StringInStr(FileGetAttrib($sPath), 'D') Then
		Return SetError(1, 0, 0)
	EndIf
	If $iSubDir = 1 Then
		$sAttrib &= ' /S'
	EndIf
	If $iSort = 1 Then
		$sAttrib &= ' /O:N'
	EndIf
	Switch $iFlag
		Case 1
			$sAttrib &= ' /A-D'
		Case 2
			$sAttrib &= ' /AD'
		Case Else
			$sAttrib &= ' /A'
	EndSwitch
	$sOut = StringToBinary('0' & @CRLF, 2)
	$sPath = StringRegExpReplace($sPath, '\\+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
	$aMasks = StringSplit($sFileMask, ';')
	For $i = 1 To $aMasks[0]
		If StringStripWS($aMasks[$i], 8) = '' Then
			ContinueLoop
		EndIf
		$sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'
		If $i < $aMasks[0] Then
			$sFiles &= ';'
		EndIf
	Next
	$hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
	While 1
		$sRead = StdoutRead($hDir, False, True)
		If @error Then
			ExitLoop
		EndIf
		If $sRead <> '' Then
			$sOut &= $sRead
		EndIf
	WEnd
	$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
	If @error Or UBound($aOut) < 2 Then
		Return SetError(2, 0, 0)
	EndIf
	$aOut[0] = UBound($aOut) - 1
	Return $aOut
EndFunc   ;==>_FileSearch
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
194
Репутация
0
madmasles
как я понимаю он ищет рекурсивно файлы .sds всё по подпапкам?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Tosyk,
Не только .sds, все файлы.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
194
Репутация
0
madmasles [?]
Не только .sds, все файлы.
как все? не понимаю, зачем нужно искать все файлы, если нужно только sds?
или скрипт ищет все файлы и применяет к каждому файлу функции, если файл sds то операция выполняется, если файлы не sds то они пропускаются? или ещё проще: если файлы не sds то они пропускаются?
вообще очень круто работает выполнение, порадовала информация в верхнем левом углу!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Tosyk,
Я добавил маску на sds-файлы, хотя Вы могли бы сделать это сами, я Вам давал пример, как это сделать.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
194
Репутация
0
madmasles
спасибо большое, буду дальше разбираться!
 
Верх