[Кнопка] Аналог многострочного bat файла

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

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

Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Вроде так:

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

[em_TreeCopy_plugin] 
cmd="%commander_path%\Plugins\exe\Hidcon.exe" cmd.exe /c start "%commander_path%\Plugins\exe\TCFS2\TCFS2.exe" /ef tcm(508) & "%commander_path%\Plugins\exe\NirCmd\NirCmd.exe" sendkeypress shift+tab shift+tab home down 
menu=TreeCopy - copying files with full folder tree
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

MVV
Тут что-то позаковыристей надо. Я уже перепробовал много разных вариаций прежде чем писать на форуме.
В предложенном варианте не срабатывает даже вызов TCFS2 (даже если убрать всё что после &).
Насколько я понимаю, путь к самой первой команды (Hidcon.exe) в кавычки можно не брать, а вот всё остальное - расценивается как параметры и где-то кавычки или удвоения процентов нужны.

В вызове второй команды (после амперсанда) тоже не всё так просто.
Пробую просто открыть командную строку и запустить напрямую

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

"%commander_path%\Plugins\exe\TCFS2\TCFS2.exe" /ef tcm(508) & "%commander_path%\Plugins\exe\NirCmd\NirCmd.exe" sendkeypress shift+tab shift+tab home down
Срабатывает только первая команда.

(Можно всё упростить, наделать кучу батников или вспомогательных команд на подобные двухярусные конструкциии, но хочется понять - как правильно записать именно в одну строку и где ставить censored кавычки).
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

LonerD
& понимает cmd, а не Тотал. Без вызова cmd.exe амперсанд ставить бестолку. Start первый же параметр в кавычках считает заголовком окна, попробуй start "" "%COMMANDER_PATH%...
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Вроде закавыка с кавычками решилась.

Вот так работает (без start и всё взять ещё в одни кавычки).

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

[em_Hello]
cmd=%commander_path%\Plugins\exe\Hidcon.exe cmd.exe /c ""%commander_path%\Plugins\exe\Nircmd\Nircmd.exe" speak text "Hello" & "%commander_path%\Plugins\exe\Nircmd\Nircmd.exe" speak text "Word""
Однако вот так конкретная команда не работает:

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

[em_TreeCopy_plugin]
cmd=%commander_path%\Plugins\exe\Hidcon.exe cmd.exe /c ""%commander_path%\Plugins\exe\TCFS2\TCFS2.exe" /ef tcm(508) & "%commander_path%\Plugins\exe\Nircmd\Nircmd.exe" sendkeypress shift+tab shift+tab home down"
menu=TreeCopy - copying files with full folder tree
Я так понимаю, что дело в TCFS2.
TCFS2 вызывает диалог архивации, а потом, похоже, переключается на окно Тотала, и Nircmd посылает свои команды уже не окну диалога архивации, а непосредственно окну самого Тотала, находящегося на заднем плане.

(забавный момент - если вызвать консоль и ввести в ней несколько раз TCFS2.exe /ef tcm(508) , то в Тотале откроется несколько диалогов архивации, а при их закрытии получается крах Тотала).
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Да, точно, start же первый параметр в кавычках считает заголовком окна (хвала мелкомягким). И да, с амперсендом надо ещё в кавычки всё брать.
Я так понимаю, что дело в TCFS2.
TCFS2 вызывает диалог архивации, а потом, похоже, переключается на окно Тотала, и Nircmd посылает свои команды уже не окну диалога архивации, а непосредственно окну самого Тотала, находящегося на заднем плане.
TCFS2 ничего никуда не переключает, делать ей больше нечего. :) Попробуй те же яйца с TCMC.
(забавный момент - если вызвать консоль и ввести в ней несколько раз TCFS2.exe /ef tcm(508) , то в Тотале откроется несколько диалогов архивации, а при их закрытии получается крах Тотала).
Весело. :D
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Попробуй те же яйца с TCMC.
Действительно. И точно так же вызываются множественные окна, приводящие к краху Тотала.
Странно, почему Nircmd посылает команды не активному окошку архивации, а неактивному Тоталовскому окошку. Заодно обнаружил ограничение Nircmd на количество эмуляций клавиатурных нажатий. Но это уже выходит за пределы данной темы.

До выяснения причин остановился на упрощённом варианте на основе одной программы.

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

cmd=%commander_path%\Plugins\exe\Nircmd\Nircmd.exe sendkeypress alt+f5 shift+tab shift+tab home down enter

cmd=%commander_path%\Plugins\exe\TCMC\TCMCWindow.exe "ttcmc=CMcm_PackFiles" "pause=20" "keybd={TAB}" "keybd={-}" "keybd={TAB}" "keybd={HOME}" "keybd={DOWN}" "keybd={ENTER}"
taravasya
Сообщения: 38
Зарегистрирован: Сб мар 27, 2010 18:50

Сообщение taravasya »

Здравствуйте. Есть схожий вариант проблемы...
Кнопка №1

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

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Plugins\vba\pr_done.vbs
"%p%n\process.xml" "<code>\d+</code>" "<code>200</code>" "%L" "%Pdescript.ion" "В_ОБР"  ""
%COMMANDER_PATH%\Multimedia\Revolution Icon 28.ico
Обрабатывается
%COMMANDER_PATH%\Plugins\cmd\
0
-1
Кнопка №2

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

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Plugins\exe\photoshop\Start.exe
%P%S
%COMMANDER_PATH%\Multimedia\PSDrop.ico
Обработка заказов
%COMMANDER_PATH%\Plugins\exe\photoshop\

-1
Возможно ли как-то объединить эти две кнопки в одну? Что-бы действия указанные в ней, выполнились последовательно?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

taravasya
С ожиданием отработки нужно править скрипт. Как он оказался в папке Plugins\vba для меня остаётся секретом. Что это за плагин такой "vba"?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
taravasya
Сообщения: 38
Зарегистрирован: Сб мар 27, 2010 18:50

Сообщение taravasya »

Flasher
Да я сам создал эту папку. Тотал настроен "портабельно". Всё что нужно распихал по папкам, что-бы не путаться.
Но это и не важно. Суть не в этом. Проблема в том, что у этих двух команд разные параметры. И даже файлы которые нужно обрабатывать внешними коммандами разные...
Возможно ли это как-то реализовать?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

taravasya писал(а):Да я сам создал эту папку.
Plugins ‡ Scripts
taravasya писал(а):Возможно ли это как-то реализовать?
Возможно. Править скрипт.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
taravasya
Сообщения: 38
Зарегистрирован: Сб мар 27, 2010 18:50

Сообщение taravasya »

Plugins ‡ Scripts
Ну это очевидно. *.exe, тоже вообщем то не плагины. Но я не захотел создавать лишних папок, и сложил всё "кастомное" в папку plugins.
Я в vbs не силён.. скрипт выполняемый из первой кнопки, мне сваяли здесь же(на этом форуме). Смогли бы Вы подсказать, что нужно добавить в скрипте?

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

'===============================================
' Замена текста в файле с помощью рег. выражений
'
' Параметры:
' {файл} {текст для поиска} {текст для замены}
'===============================================
Option Explicit
Dim FSO, F, Str1, Str2, Text
Set FSO = CreateObject("Scripting.FileSystemObject")
With WScript
  F    = .Arguments(0)
  Str1 = .Arguments(1)
  Str2 = .Arguments(2)
End With
F = FSO.GetAbsolutePathName(CreateObject("WScript.Shell").ExpandEnvironmentStrings(F))

Text = FSO.OpenTextFile(F, 1).ReadAll
Text = RegExpReplace(Text, Str1, Str2)
FSO.OpenTextFile(F, 2).Write Text

Set FSO = Nothing

Dim FSOT, oTextFile, AllText, OTF, FileName, CommFile, CommLabel, CommLabelDel, BegFile, BegFileComm
Set FSOT   = CreateObject("Scripting.FileSystemObject")
Set OTF   = FSOT.OpenTextFile(WScript.Arguments(3), 1)
CommFile  = WScript.Arguments(4)
CommLabel = WScript.Arguments(5)
CommLabelDel = WScript.Arguments(6)

AllText = ""
If FSOT.FileExists(CommFile) Then
  Set oTextFile = FSOT.OpenTextFile(CommFile, 1)
  On Error Resume Next 'Игнорируем ошибку, если файл пустой
    AllText = oTextFile.ReadAll
  On Error GoTo 0
  oTextFile.Close
End If

Do While Not OTF.AtEndOfStream
  FileName = OTF.ReadLine
  If FSOT.FileExists(FileName) Then
    FileName = FSOT.GetFile(FileName).Name
  Else
    FileName = FSOT.GetFolder(FileName).Name
  End If
  If InStr(1, FileName, " ", 1) > 0 Then
    FileName = """" & FileName & """"
  End If
  BegFile = InStr(1, vbNewLine & AllText, vbNewLine & FileName & " ", 1)
  If BegFile > 0 Then
    BegFileComm = BegFile + Len(FileName) + 1
    If InStr(1, Mid(AllText, BegFileComm, Len(CommLabelDel)), CommLabelDel, 1) > 0 Then
      AllText = Left(AllText, BegFileComm - 1) & Mid(AllText, BegFileComm + Len(CommLabelDel))
      'Удаление лишних пробелов
      If Instr(BegFile, AllText, FileName & "  ", 1) > 0 Then
        AllText = Left(AllText, BegFileComm - 2) & Mid(AllText, BegFileComm)
      End If
      'Удаление пустых комментариев
      If Instr(BegFile, AllText & vbNewLine, FileName & " " & vbNewLine) > 0 Then
        AllText = Left(AllText, BegFile - 1) & Mid(AllText, BegFile + Len(FileName & " " & vbNewLine))
      End If
      'Удаление лишних концевых строк
      If Right(AllText, Len(vbNewLine)) = vbNewLine Then
        AllText = Left(AllText, Len(AllText) - Len(vbNewLine))
      End If
      Set oTextFile = FSOT.OpenTextFile(CommFile, 2)
      oTextFile.Write AllText
      oTextFile.Close
    End If
  End If
Loop

Set FSOT   = CreateObject("Scripting.FileSystemObject")
Set OTF   = FSOT.OpenTextFile(WScript.Arguments(3), 1)
CommFile  = WScript.Arguments(4)
CommLabel = WScript.Arguments(5)
CommLabelDel = WScript.Arguments(6)

Do While Not OTF.AtEndOfStream
  FileName = OTF.ReadLine
  If FSOT.FileExists(FileName) Then
    FileName = FSOT.GetFile(FileName).Name
  Else
    FileName = FSOT.GetFolder(FileName).Name
  End If
  If InStr(1, FileName, " ", 1) > 0 Then
    FileName = """" & FileName & """"
  End If
  BegFile = InStr(1, vbNewLine & AllText, vbNewLine & FileName & " ", 1)
  If BegFile > 0 Then
    BegFileComm = BegFile + Len(FileName) + 1
    If InStr(1, Mid(AllText, BegFileComm, Len(CommLabel)), CommLabel, 1) = 0 Then
      AllText = Left(AllText, BegFileComm - 1) & CommLabel & " " & Mid(AllText, BegFileComm)
      Set oTextFile = FSOT.OpenTextFile(CommFile, 2)
      oTextFile.Write AllText
      oTextFile.Close
    End If
  Else
    Set oTextFile = FSOT.OpenTextFile(CommFile, 8, 2)
    If Right(AllText, Len(vbNewLine)) <> vbNewLine Then
      oTextFile.WriteLine
      AllText = AllText & vbNewLine
    End If
    oTextFile.Write FileName & " " & CommLabel
    oTextFile.Close
    AllText = AllText & FileName & " " & CommLabel
  End If
Loop

OTF.Close
Set oTextFile = Nothing
Set OTF       = Nothing
Set FSOT       = Nothing 
WScript.Quit 0

'Функция замены с помощью регулярных выражений
Function RegExpReplace(pText, pFindStr, pNewStr)
  Dim regEx
  Set regEx        = New RegExp
  regEx.Pattern    = pFindStr
  regEx.IgnoreCase = True
  regEx.Global     = True
  RegExpReplace    = regEx.Replace(pText, pNewStr)
  Set regEx        = Nothing
End Function
Скрипт универсальный, для трёх разных кнопок. Его действие изменяется в зависимости от входных параметров.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

taravasya писал(а):мне сваяли здесь же(на этом форуме)
И кто автор? На форуме этого скрипта нет. Может, автора и попросить?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
taravasya
Сообщения: 38
Зарегистрирован: Сб мар 27, 2010 18:50

Сообщение taravasya »

Тут сборная солянка. Часть скрипта от Batya, часть Ваша ))))). Возможно, что-то я ещё сам замудрил туда выбрав подходящую часть скрипта...

Добавлено спустя 6 минут:

Собственно, началось всё от сюда:
http://forum.wincmd.ru/viewtopic.php?p=61341
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Тема перенесена из "Общих вопросов" в "Автоматизацию".
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

taravasya
А Start.exe списки понимает или только перечисленные файлы в строке?
И не лучше пофайлово редактировать - запускать?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить