Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

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

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Andrey_A



Joined: 10 Apr 2009
Posts: 394
Location: Сочи

Post (Separately) Posted: Wed Oct 06, 2010 02:31    Post subject: Запуск выделенных файлов ассоциированной программой Reply with quote

Недавно подчищал тотал и обнаружил десяток кнопок, которые запускали выделенные файлы для различных программ, и решил их объединить в одну. Скрипт работает для тех программ, которые поддерживают открытие нескольких файлов одновременно... есть наверно нюансы (для тех программ, которых у меня нет), но двухнедельная работа со скриптом оставила у меня положительные эмоции. Любые доработки приветствуются.
Code:
'========================   Описание   ===================================== 
' Запуск ВЫДЕЛЕННЫХ файлов в Программе , ассоциированной в 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


 !  Avada:
Полагаю, что более подходящим подфорумом для этого скриптового решения является (вместо "Секретов и советов") "Автоматизация".
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Wed Oct 06, 2010 10:35    Post subject: Reply with quote

Andrey_A
Пока твой скрипт не планирую использовать, но хочу дать несколько конструктивных советов по написанию скриптов.
- Часто используемые конструкции лучше выносить в функции, например: "FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings())"
- Форматирование текста кода у тебя есть (это гуд!), но какое-то местами неровное. Например, кусок
Code:
    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
я бы записал
Code:
    ' Готовим строку для поиска в ассоциациях
    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 строки можно разбивать на части, указав в конце строки символ "_". Например:
Code:
   MsgBox "Неправильно указано количество параметров!" & vbNewLine &_
          "Должно быть ПЯТЬ параметров!"               & vbNewLine &_
          "A у Вас прописано " & WScript.Arguments.Count & " !!! ", _
          vbOKOnly + vbCritical

_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Samwatas



Joined: 12 Sep 2009
Posts: 95

Post (Separately) Posted: Wed Oct 06, 2010 12:41    Post subject: Reply with quote

А что, vbs с табуляторами не работает? По моему удобнее отступы делать табом.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Wed Oct 06, 2010 12:59    Post subject: Reply with quote

Samwatas
Всё прекрасно работает. Это уже вопрос не к языку, а к текстовому редактору. Я при настройке текстового редактора сразу устанавливаю замену Tab двумя пробелами - лично мне так удобнее.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10236
Location: Россия, Саратов

Post (Separately) Posted: Fri Mar 23, 2012 07:11    Post subject: Reply with quote

Последующий оффтоп удалён. Участнику navicapic выносится замечание за нарушение правил форума. Подробности — в ЛС.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10236
Location: Россия, Саратов

Post (Separately) Posted: Mon Feb 11, 2013 14:34    Post subject: Reply with quote

Оффтопное сообщение участника Drrean тоже удалено. Замечание за нарушение правил форума. Комментарии — в ЛС.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group