Что нового

запуск списка файлов в одном и том же скрипте

Tosyk

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

Есть скрипт конвертирующий tga в png. Для того чтобы конвертировать tga нужно просто перетащить его на скрипт (я сделал из него exe) — рядом с tga появится png с таким же именем.

Код:
#Include <File.au3>

AutoItSetOption("MustDeclareVars", 1)

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

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


If $CmdLine[0] <> 0 Then
	If FileInstall("convert.exe", @TempDir & "\", 1) = 1 Then
		ProgressOn("Converting", "", "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, ".png")

					RunWait("""" & @TempDir & "\convert.exe"" """ & $sSourceFile & """ -alpha on """ & $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 , "Converting complete", "100%")

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

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

Exit(0)


Я создал контекстное меню для tga с таким параметром:
"\"D:\\converting_textures\\Bin\\tga-to-png.exe\" \"%1\""

Конвертирование через контекстное меню работает!

Но как только я выбираю более 1 файла и конвертирую - для каждого файла открывается отдельная программа. Однако конвертер в png может обрабатывать любое количество tga файлов показывая полоску прогресса.

Вопрос простой: как сделать так чтобы все выделенные файлы через контекстное меню открывались бы в одной копии программы? Я кинул всё в Send To. Но хочется чтобы меню было только для определённых форматов. Такая специальная функция.
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Tosyk
Попробуйте
Код:
"\"D:\\converting_textures\\Bin\\tga-to-png.exe\" \"%L\""
 
Автор
Tosyk

Tosyk

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

alex33

Скриптер
Сообщения
1,457
Репутация
186
Если в проводнике выделить несколько текстовых файлов и нажать "Открыть", то тоже запустится несколько блокнотов.
Значит это стандартное поведение ОС.
 
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
alex33,
но если эти текстовые файлы открыть в Notepad++ то откроется только одна версия программы. Фотошоп делает тоже самое. Поэтому я и спрашиваю на форуме автоита, а не на форуме windows. Дело в программе (скрипте). Получается, что в программе задана некая проверка на открытие нескольких фалов в ОСи.

Возможно ли как-то реализовать эту проверку в скрипте (в моём случае в exe)?
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Tosyk
С %L прогнал, просто подсмотрел в WMP.
Возможно ли как-то реализовать эту проверку в скрипте (в моём случае в exe)?
Как вариант: использовать
Код:
AutoItWinSetTitle(@ScriptFullPath)

и при запуске проверять существование окна
Код:
If WinExists(@ScriptFullPath) ...

и если есть - с помощью WM_COPYDATA передавать уже существующей копии $CmdLine[1].
Приблизительно так, вероятно, ведут себя AkelPad и упомянутый Notepad++.

ИМХО, если пользуетесь файловым менеджером вроде Total Commander или Double Commander, то проще передавать файлы списком (для первого и второго): прочитать текстовый файл, разрезать построчно в массив и конвертировать в цикле куда проще. И быстрее написать.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Автор
Tosyk

Tosyk

Новичок
Сообщения
206
Репутация
0
Yashied сказал(а):
спасибо! но там в начале говорится о двух способах а рассматривается только второй. Ещё у меня может быть, например, 7000 файлов, и, либо задержка будет больше 200 мс что приведёт к долгому ожиданию "без видимых причин" либо не все файлы буду передаваться.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
На самом деле задержка в том примере нужна была только для того, чтобы получить непрерывный список файлов (массив). Если убрать задержку, то в любом случае все файлы будут переданы, только нужно будет учитывать, что WM_COPYDATA может прийти в любой момент, следовательно нужно будет формировать очередь.

Первый способ не рассматривался из-за его муторности, да и лень мне фигней заниматься, т.к. этот способ сейчас мало где используется (я думаю). Да и потом я там дал ссылку на библиотеку. Разбирайтесь, если хотите.

P.S

Если из всего вышеперечисленного вам не понятно ни слова, то советую до поры, до времени забить на это дело.
 
Верх