Что нового

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

Tosyk

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

Есть программа nvdxt.exe (конвертер текстур в формат dds). Нужная команда:

nvdxt -file tach_cockpit.tga -dxt1c -quality_highest -outsamedir -output tach_cockpit.dds

Скрипт, который по идее должен это делать (написан не мной, я его просто исправил):

Код:
#Include <File.au3>

AutoItSetOption("MustDeclareVars", 1)

Local $i
Local $sSourceFile, $sDestFile
Local $sDrive, $sFolder, $sFileName, $sExt

Local $sPattern = "\.(?i:tga|jpg|bmp|png|tif|jpeg)"


If $CmdLine[0] <> 0 Then
	If FileInstall("nvdxt.exe", @TempDir & "\", 1) = 1 Then
		ProgressOn("Compressing", "", "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
					$sDestFile = _PathMake($sDrive, $sFolder, $sFileName, ".dds")

					RunWait("""" & @TempDir & "\nvdxt.exe"" """ & """ -file """ & $sSourceFile & """ -dxt1c -outsamedir -output """ & $sDestFile & """", @TempDir, @SW_HIDE)
				Else
					ConsoleWriteError("Extension of file [" & $sSourceFile & "] is [" & $sExt & "] and not in [" & $sPattern & "]" & @CRLF)
				EndIf
			Else
				ConsoleWriteError("File [" & $sSourceFile & "] not found" & @CRLF)
			EndIf
		Next

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

		If FileExists(@TempDir & "\nvdxt.exe") = 1 Then
			FileDelete(@TempDir & "\nvdxt.exe")
		EndIf

		Sleep(1000)
		ProgressOff()
	Else
		ConsoleWriteError("Can't extract [nvdxt.exe] into [" & @TempDir & "]" & @CRLF)
	EndIf
Else
	MsgBox(0, "Usage", @ScriptName & " <file>")
	ConsoleWrite("Usage: " & @ScriptName & " <file>" & @CRLF)
EndIf

Exit(0)


По идее должно конвертировать tga в dds, но ничего не происходит.

Буду признателен помощи.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Код:
RunWait("""" & @TempDir & "\nvdxt.exe"" """ & """ -file """ & $sSourceFile & """ -dxt1c -outsamedir -output """ & $sDestFile & """", @TempDir, @SW_HIDE)
Для чего столько кавычек?
Код:
RunWait(@TempDir & '\nvdxt.exe -file ' & $sSourceFile & ' -dxt1c -outsamedir -output ' & $sDestFile, @TempDir, @SW_HIDE)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk,
У Вас ошибка с кавычками:
Код:
$sSourceFile = @ScriptFullPath
$sDestFile = @ScriptFullPath
;~ Ваша строка:
ConsoleWrite("""" & @TempDir & "\nvdxt.exe"" """ & """ -file """ & $sSourceFile & """ -dxt1c -outsamedir -output """ & $sDestFile & """" & @LF)
;~ Должно быть:
ConsoleWrite('"' & @TempDir & '\nvdxt.exe"' & ' -file "' & $sSourceFile & '" -dxt1c -outsamedir -output "' & $sDestFile & '"' & @LF)
ConsoleWrite("""" & @TempDir & "\nvdxt.exe""" & " -file """ & $sSourceFile & """ -dxt1c -outsamedir -output """ & $sDestFile & """" & @LF)



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

ildar,
Если в путях есть пробелы, до их надо экранировать кавычками(двойными).
 
Автор
Tosyk

Tosyk

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

однако если я делаю строку такой:

Код:
RunWait('"' & @TempDir & '\nvdxt.exe"' & ' -file "' & $sSourceFile & '" -dxt1c -outsamedir -output "' & $sDestFile & '"' & @LF)


то во время выполнения мелькает консольное окно (не понятно почему) и рядом с конвертируемым файлом появляется nvdxt_scratch.tmp

нужного файла ИМЯ_ФАЙЛА.dds не появляется.
 
Автор
Tosyk

Tosyk

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

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

Код:
RunWait("""" & @TempDir & "\nvdxt.exe"" """ & """ -file """ & $sSourceFile & """ -dxt1c -outsamedir -output """ & $sDestFile & """", @TempDir, @SW_HIDE)


вашими двумя:

Код:
ConsoleWrite('"' & @TempDir & '\nvdxt.exe"' & ' -file "' & $sSourceFile & '" -dxt1c -outsamedir -output "' & $sDestFile & '"' & @LF)
ConsoleWrite("""" & @TempDir & "\nvdxt.exe""" & " -file """ & $sSourceFile & """ -dxt1c -outsamedir -output """ & $sDestFile & """" & @LF)


вы не писали ни про @SW_HIDE ни про другие параметры.

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

Tosyk

Новичок
Сообщения
206
Репутация
0
Прошу прощения за даблпост. Мне кажется тут проблема очень не серьёзная. Профи, помогите пожалуйста. Я могу прикрепить nvdxt.exe если это нужно.

Сам я перепробовал и перечитал и переэкранировал уже все варианты. Не могу понять в чём проблема.
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Tosyk
Код:
If FileExists($sSourceFile) Then
                _PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)

:scratch:
FileInstall() вроде только для скомпилированных скриптов?

nvdxt.exe рядом со скриптом:
Код:
#Include <File.au3>

AutoItSetOption('MustDeclareVars', 1)

Local $i
Local $sSourceFile, $sDestFile
Local $sDrive, $sFolder, $sFileName, $sExt, $aPathSplit

Local $sPattern = '\.(tga|jpg|bmp|png|tif|jpeg)'

If $CmdLine[0] <> 0 Then
;    If FileInstall('nvdxt.exe', @TempDir & '\', 1) = 1 Then
    If FileExists(@ScriptDir & '\nvdxt.exe') Then
        ProgressOn('Compressing', '', '0%')

        For $i = 1 To $CmdLine[0]
            $sSourceFile = $CmdLine[$i]
            $aPathSplit = _PathSplit($sSourceFile)
            ProgressSet(($i / $CmdLine[0]) * 100, $aPathSplit[3] & $aPathSplit[4], String(Round($i / $CmdLine[0] * 100, 1)) & '%')

            If FileExists($sSourceFile) Then
                If StringRegExp($aPathSplit[4], $sPattern, 0) Then
                    $sDestFile = StringRegExpReplace($sSourceFile, '(?im)\.(tga|jpg|bmp|png|tif|jpeg)$', '.dds')
                    RunWait('"' & @ScriptDir & '\nvdxt.exe" ' & ' -file "' & $sSourceFile & '" -dxt1c -outsamedir -output "' & $sDestFile & '"', @TempDir, @SW_HIDE)
                Else
                    ConsoleWriteError('Extension of file [' & $sSourceFile & '] is [' & $sExt & '] and not in [' & $sPattern & ']' & @CRLF)
                EndIf
            Else
                ConsoleWriteError('File [' & $sSourceFile & '] not found' & @CRLF)
            EndIf
        Next

        ProgressSet(100 , 'Compressing complete', '100%')

;        If FileExists(@TempDir & '\nvdxt.exe') = 1 Then
;            FileDelete(@TempDir & '\nvdxt.exe')
;        EndIf

        Sleep(1000)
        ProgressOff()
    Else
        ConsoleWriteError("Can't extract [nvdxt.exe] into [" & @TempDir & "]" & @CRLF)
    EndIf
Else
    MsgBox(0, 'Usage', @ScriptName & ' <file>')
    ConsoleWrite('Usage: ' & @ScriptName & ' <file>' & @CRLF)
EndIf

Exit(0)
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
Skif_off сказал(а):
Tosyk
Код:
If FileExists($sSourceFile) Then
                _PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)

:scratch:
FileInstall() вроде только для скомпилированных скриптов?
вообще да, я этот скрипт потом компилирую и перетаскиваю на exe нужны мне файлы!
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Tosyk [?]
вообще да, я этот скрипт потом компилирую и перетаскиваю на exe нужны мне файлы!
Тогда раскомментируйте закомментированные строки, замените @ScriptDir на @TempDir и попробуйте ещё раз.

И вы цитируете больше, чем нужно: смайл относился не к FileInstall(), а к строке
Код:
_PathSplit($sSourceFile, $sDrive, $sFolder, $sFileName, $sExt)

где непонятно что происходит.
Вообще уберите эту функцию и не понадобится #include <File.au3> и получайте имя файла с помощью StringRegExpReplace(), тогда так:
Код:
Local $i, $sSourceFile, $sDestFile, $sDrive, $sFolder, $sFileName, $sExt, $sPattern = '\.(tga|jpg|bmp|png|tif|jpeg)'
;...

        For $i = 1 To $CmdLine[0]
            $sSourceFile = $CmdLine[$i]
            $sFileName = StringRegExpReplace($sSourceFile, '^.*\\', '')
            ProgressSet(($i / $CmdLine[0]) * 100, $sFileName, String(Round($i / $CmdLine[0] * 100, 1)) & '%')

Запускал нескомпилированный скрипт так:
Код:
AutoIt3.exe convert.au3 file1 file2 file3 file4 file5
всё работало.
 
Автор
Tosyk

Tosyk

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

Пробовал так:

Код:
#Include <File.au3>

AutoItSetOption('MustDeclareVars', 1)

Local $i
Local $sSourceFile, $sDestFile
Local $sDrive, $sFolder, $sFileName, $sExt, $aPathSplit

Local $sPattern = '\.(tga|jpg|bmp|png|tif|jpeg)'

If $CmdLine[0] <> 0 Then
    If FileInstall('nvdxt.exe', @TempDir & '\', 1) = 1 Then
;     If FileExists(@ScriptDir & '\nvdxt.exe') Then
        ProgressOn('Compressing', '', '0%')

        For $i = 1 To $CmdLine[0]
            $sSourceFile = $CmdLine[$i]
            $aPathSplit = _PathSplit($sSourceFile)
            ProgressSet(($i / $CmdLine[0]) * 100, $aPathSplit[3] & $aPathSplit[4], String(Round($i / $CmdLine[0] * 100, 1)) & '%')

            If FileExists($sSourceFile) Then
                If StringRegExp($aPathSplit[4], $sPattern, 0) Then
                    $sDestFile = StringRegExpReplace($sSourceFile, '(?im)\.(tga|jpg|bmp|png|tif|jpeg)$', '.dds')
                    RunWait('"' & @ScriptDir & '\nvdxt.exe" ' & ' -file "' & $sSourceFile & '" -dxt1c -outsamedir -output "' & $sDestFile & '"', @TempDir, @SW_HIDE)
                Else
                    ConsoleWriteError('Extension of file [' & $sSourceFile & '] is [' & $sExt & '] and not in [' & $sPattern & ']' & @CRLF)
                EndIf
            Else
                ConsoleWriteError('File [' & $sSourceFile & '] not found' & @CRLF)
            EndIf
        Next

        ProgressSet(100 , 'Compressing complete', '100%')

        If FileExists(@TempDir & '\nvdxt.exe') = 1 Then
            FileDelete(@TempDir & '\nvdxt.exe')
        EndIf

        Sleep(1000)
        ProgressOff()
    Else
        ConsoleWriteError("Can't extract [nvdxt.exe] into [" & @TempDir & "]" & @CRLF)
    EndIf
Else
    MsgBox(0, 'Usage', @ScriptName & ' <file>')
    ConsoleWrite('Usage: ' & @ScriptName & ' <file>' & @CRLF)
EndIf

Exit(0)


и так:

Код:
AutoItSetOption('MustDeclareVars', 1)

Local $i, $sSourceFile, $sDestFile, $sDrive, $sFolder, $sFileName, $sExt, $sPattern = '\.(tga|jpg|bmp|png|tif|jpeg)'

If $CmdLine[0] <> 0 Then
    If FileInstall('nvdxt.exe', @TempDir & '\', 1) = 1 Then
;     If FileExists(@ScriptDir & '\nvdxt.exe') Then
        ProgressOn('Compressing', '', '0%')

        For $i = 1 To $CmdLine[0]
            $sSourceFile = $CmdLine[$i]
            $sFileName = StringRegExpReplace($sSourceFile, '^.*\\', '')
            ProgressSet(($i / $CmdLine[0]) * 100, $sFileName, String(Round($i / $CmdLine[0] * 100, 1)) & '%')

            If FileExists($sSourceFile) Then
                If StringRegExp($aPathSplit[4], $sPattern, 0) Then
                    $sDestFile = StringRegExpReplace($sSourceFile, '(?im)\.(tga|jpg|bmp|png|tif|jpeg)$', '.dds')
                    RunWait('"' & @ScriptDir & '\nvdxt.exe" ' & ' -file "' & $sSourceFile & '" -dxt1c -outsamedir -output "' & $sDestFile & '"', @TempDir, @SW_HIDE)
                Else
                    ConsoleWriteError('Extension of file [' & $sSourceFile & '] is [' & $sExt & '] and not in [' & $sPattern & ']' & @CRLF)
                EndIf
            Else
                ConsoleWriteError('File [' & $sSourceFile & '] not found' & @CRLF)
            EndIf
        Next

        ProgressSet(100 , 'Compressing complete', '100%')

        If FileExists(@TempDir & '\nvdxt.exe') = 1 Then
            FileDelete(@TempDir & '\nvdxt.exe')
        EndIf

        Sleep(1000)
        ProgressOff()
    Else
        ConsoleWriteError("Can't extract [nvdxt.exe] into [" & @TempDir & "]" & @CRLF)
    EndIf
Else
    MsgBox(0, 'Usage', @ScriptName & ' <file>')
    ConsoleWrite('Usage: ' & @ScriptName & ' <file>' & @CRLF)
EndIf

Exit(0)


Error: Variable used without being declared.

я наверное что-то неправильно делаю, да?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk,
Прикрепите nvdxt.exe и пару картинок.
 
Автор
Tosyk

Tosyk

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

http://www.mediafire.com/download/p2kb8xb3mmknsax/converting_textures.zip

Там так же есть imagemagick convert.exe и скрипт, которые я использую для конвертирования в png. Этот скрипт почти идентичен тому, что я вставил в первый пост. только этот работает, а вставленный нет.

Буду признателен.

p.s.: imagemagick convert.exe тоже умеет конвертировать картинки в dds, но делает это криво и с малым количеством параметров.
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Tosyk
Так
Код:
RunWait('"' & @ScriptDir & '\nvdxt.exe" '

не будет работать, ведь nvdxt.exe вы извлекаете не рядом со скриптом, исправьте на:
Код:
RunWait('"' & @TempDir & '\nvdxt.exe" '


Error: Variable used without being declared
Лишняя переменная здесь:
Код:
If StringRegExp($aPathSplit[4], $sPattern, 0) Then

прошу прощения, проглядел, т.к. _PathSplit() убрана, исправьте на
Код:
If StringRegExp($sSourceFile, $sPattern, 0) Then
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Tosyk,
Так у меня все работает с Вашими файлами (в скомпилированном виде).
Код:
#cs ----------------------------------------------------------------------------
	AutoIt Version:		3.3.8.1
	Author:				madmasles
#ce ----------------------------------------------------------------------------
Opt('TrayMenuMode', 3)
Opt('MustDeclareVars', 1)

If WinExists('[TITLE:{7619078-DKJNBVC-WQNMOLK}; CLASS:AutoIt v3]') Then Exit
AutoItWinSetTitle('{7619078-DKJNBVC-WQNMOLK}')

If Not $CmdLine[0] Then Exit MsgBox(16, 'Error', 'Usage ' & @ScriptName & ' <file>')

Global $sNvdxt = @TempDir & '\nvdxt.exe', $iCount = 0, $iError = 0, $iPercent, $iAll = $CmdLine[0]

If Not FileInstall('nvdxt.exe', $sNvdxt, 1) Then Exit MsgBox(16, 'Error', 'Can''t extract [nvdxt.exe] into [' & @TempDir & ']')
ProgressOn('Compressing', 'Files: 0 (' & $iAll & ')', '0%')
For $i = 1 To $CmdLine[0]
	If (Not FileExists($CmdLine[$i])) Or (Not StringRegExp($CmdLine[$i], '(?i)\.(tga|jpg|bmp|png|tif|jpeg|jpg)$')) Then
		$iAll -= 1
		ContinueLoop
	EndIf
;~ 	If RunWait('"' & $sNvdxt & '" -file "' & $CmdLine[$i] & '" -dxt1c -outsamedir -output "' & StringRegExpReplace($CmdLine[$i], '(?i)\..+$', '.dds') & '"', '', @SW_HIDE) Then
	If RunWait('"' & $sNvdxt & '" -file "' & $CmdLine[$i] & '" -dxt1c', '', @SW_HIDE) Then; не заметил никакой разницы с такими параметрами
		$iError += 1
	Else
		$iCount += 1
	EndIf
	$iPercent = Round($iCount / $iAll * 100)
	ProgressSet($iPercent, $iPercent & '%', 'Files: ' & $iCount & ' (' & $iAll & ')')
Next
Sleep(2000)
ProgressOff()
If $iError Then MsgBox(16, 'Error', 'Errors: ' & $iError & @LF & 'Files converted: ' & $iCount & ' (' & $iAll & ')')
PS
Только не называйте файл nvdxt.au3.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
Всё сработало. большое спасибо!
 
Верх