Запуск выделенных файлов ассоциированной программой

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Моторокер, Avada, CaptainFlint, Nik, d-view

Ответить
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Запуск выделенных файлов ассоциированной программой

Сообщение Andrey_A »

Недавно подчищал тотал и обнаружил десяток кнопок, которые запускали выделенные файлы для различных программ, и решил их объединить в одну. Скрипт работает для тех программ, которые поддерживают открытие нескольких файлов одновременно... есть наверно нюансы (для тех программ, которых у меня нет), но двухнедельная работа со скриптом оставила у меня положительные эмоции. Любые доработки приветствуются.

Код: Выделить всё

'========================   Описание   =====================================  
' Запуск ВЫДЕЛЕННЫХ файлов в Программе , ассоциированной в Total Commander
 '
' В параметрах вызова из TC должно быть прописанo ПЯТЬ параметров: 
' {Файл Список} {Файл\Секция Ассоциаций} {Параметр вызова Окна Программы 1|2|3} {Параметр добавления файлов True|False} {Приостановка между вызовом файлов в милисекундах}
'
' ============== Параметр №1 {Файл Список} =====================================
'
' 		Должно быть прописано %L либо Путь\к_файл_списку_открываемых_файлов.txt
'
' ============== Параметр №2 {Файл\Секция Ассоциаций} ============================
'
' 		Ассоциации прописаны в секции [Associations] 
' 		Для корректной работы секцию рекомендуется вынести из файла Wincmd.ini , прописав в нём
' [Associations]
' RedirectSection=WinAssociations.ini
'
' 		Можно составить СВОЙ ФАЙЛ АССОЦИАЦИЙ, вне файла Wincmd.ini где синтаксис будет таким же как и в секции {Associations}  (без строки значков)
'
' Filter1=*.TXT;*.inc;
' Filter1_open=""%COMMANDER_PATH%\Plugins\exe\AkelPad\AkelPad.exe" "%1""
' Filter2=*.JPG;*.bmp;
' Filter2_open=""%COMMANDER_PATH%\Plugins\wlx\Imagine\Imagine.exe" "%1""
'
' 		Важно!!! После расширения, даже если оно одно добавлять {;} (точку с запятой) т.е.  Filter1=*.TXT;
'
'============== Параметр №3  {Параметр вызова Окна Программы 1|2|3 } ===============================
'
'             1 - Активизирует и отображает окно.
'	      2 - Активизирует окно и отображает его в свёрнутом виде.
'	      3 - Активизирует окно и отображает его в максимизированном виде.
'	 
'============== Параметр №4  {Параметр добавления файлов True|False } ===============================
'
'            True - сценарий возобновит работу только после завершения вызванного процесса. (файлы открываются ПО ОЧЕРЕДИ)
'            False  - управление передаётся сразу обратно в сценарий. (файлы открываются, не дожидаясь открытия предыдущего)
'
'============== Параметр №5  {Приостановка между вызовом файлов в милисекундах} =====================
'
' 		При быстром открывании большого к-ва файлов некоторые не открываются, поэтому с этим параметром надо поиграть
'
'============== Дополнение ================================================================
'
' 		Если программа открывается долго, то при первом посылании нескольких файлов откроется только один
' 		При повторном посылании открываются все. Поэтому желательно открыть саму программу заранее
' 		Или сначала послать один файл, затем выделить и добавить остальные
' 		Скрипт открывает не только файлы одного типа. 
' 		Всё что выделено - всё откроется в соответствующих программах, прописанных в файле\секции Ассоциаций
'
'============== Примеры ===================================================================
'
'  %L "%%COMMANDER_PATH%%\WinAssociations.ini" 1 "False" 100
'  %L "%%COMMANDER_PATH%%\Wincmd.ini" 2 "False" 200
'  %L "%%COMMANDER_PATH%%\UserAssociations_1.txt" 1 "True" 0
' "%%COMMANDER_PATH%%\ListFiles.txt" "%%COMMANDER_PATH%%\UserAssociations_2.txt" 3 "False" 300
'
' Автор:             Аверин Андрей 2010
' Версия:          1.5
' 
'================================================================================
Option Explicit
Dim FSO, WSH, ListFile, FF, F, Program, Param, Ext, Ass, ListAss, Stroka, Okno, FileRun, Sec, i, m
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")

If WScript.Arguments.Count < 5 Then
	MsgBox "Неправильно указано количество параметров!" & vbNewLine & "Должно быть ПЯТЬ параметров!" & vbNewLine & "A у Вас прописано " & WScript.Arguments.Count & " !!! " , vbOKOnly & vbCritical
	  Wscript.Quit
End If

	FF = WScript.Arguments(0)
	FF = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(FF)) 	
	Okno = WScript.Arguments(2)
	FileRun = WScript.Arguments(3)
	Sec = WScript.Arguments(4)

	Set ListFile = FSO.OpenTextFile(FF, 1)
Do While Not ListFile.AtEndOfStream     
 	Param = ListFile.ReadLine
 	Ext = FSO.GetExtensionName(Param) 		' Извлекаем расширение файла
 	Ext = UCase("*." & Ext & ";")                                  ' Готовим строку для поиска в ассоциациях
 		Ass = WScript.Arguments(1)
		Ass = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(Ass))
		ListAss =  Split(FSO.OpenTextFile(Ass).ReadAll, vbNewLine) 
			i = 0
			m = 0
     For Each F In ListAss
		  		
	If F <> "" Then 
	
	  	If  InStr(1,ListAss(i),"|") > 1 Then 
	  		Stroka = UCase(Left(ListAss(i), InStr(1,ListAss(i),"|")))
	  	Else
	  		Stroka = UCase(ListAss(i))
	  	End If
	  
	  	if m = 0 Then

 		 	if InStr(1,Stroka,Ext) > 1 Then  ' Ищем номер строки и затем ассоциированную программу 
	 	 		Program = Mid(ListAss(i+1), InStr(1, ListAss(i + 1), chr(34)) + 2 , Len(ListAss(i+1)) - InStr(1, ListAss(i + 1), chr(34)) - 8)
 				m = 1
	 		End if
 		End if
 		i = i + 1
	End If
    Next

	Program = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(Program))
	Param = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(Param))

	WSH.Run chr(34) & Program & chr(34) & " " & chr(34) & Param & chr(34) ,Okno , FileRun
        WScript.Sleep Sec
Loop

   Set FSO = Nothing
   WScript.Quit
[mod="Avada"]Полагаю, что более подходящим подфорумом для этого скриптового решения является (вместо "Секретов и советов") "Автоматизация". [/mod]
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Andrey_A
Пока твой скрипт не планирую использовать, но хочу дать несколько конструктивных советов по написанию скриптов.
- Часто используемые конструкции лучше выносить в функции, например: "FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings())"
- Форматирование текста кода у тебя есть (это гуд!), но какое-то местами неровное. Например, кусок

Код: Выделить всё

    Ext = UCase("*." & Ext & ";")                                  ' Готовим строку для поиска в ассоциациях 
       Ass = WScript.Arguments(1) 
      Ass = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(Ass)) 
      ListAss =  Split(FSO.OpenTextFile(Ass).ReadAll, vbNewLine) 
         i = 0 
         m = 0 
     For Each F In ListAss 
               
   If F <> "" Then 
    
        If  InStr(1,ListAss(i),"|") > 1 Then
я бы записал

Код: Выделить всё

    ' Готовим строку для поиска в ассоциациях
    Ext     = UCase("*." & Ext & ";")
    Ass     = WScript.Arguments(1) 
    Ass     = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(Ass)) 
    ListAss = Split(FSO.OpenTextFile(Ass).ReadAll, vbNewLine) 
    i = 0
    m = 0
    For Each F In ListAss 
      If F <> "" Then 
        If InStr(1,ListAss(i),"|") > 1 Then
- Также сразу для себя определись с размером отступа для вложенных конструкций. Чаще всего используют либо 2, либо 4 пробела.
- Строки лучше не делать очень длинными - код при этом плохо читается. В vbs строки можно разбивать на части, указав в конце строки символ "_". Например:

Код: Выделить всё

   MsgBox "Неправильно указано количество параметров!" & vbNewLine &_
          "Должно быть ПЯТЬ параметров!"               & vbNewLine &_
          "A у Вас прописано " & WScript.Arguments.Count & " !!! ", _
          vbOKOnly + vbCritical
Нет, я не сплю. Я просто медленно моргаю.
Samwatas
Сообщения: 95
Зарегистрирован: Сб сен 12, 2009 20:26

Сообщение Samwatas »

А что, vbs с табуляторами не работает? По моему удобнее отступы делать табом.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Samwatas
Всё прекрасно работает. Это уже вопрос не к языку, а к текстовому редактору. Я при настройке текстового редактора сразу устанавливаю замену Tab двумя пробелами - лично мне так удобнее.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Последующий оффтоп удалён. Участнику navicapic выносится замечание за нарушение правил форума. Подробности — в ЛС.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Оффтопное сообщение участника Drrean тоже удалено. Замечание за нарушение правил форума. Комментарии — в ЛС.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Ответить