Автор |
Сообщение |
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
У кого-то подобное уже есть, кому-то это не нужно, мне показалось удобным, сделал, делюсь.
Собственно ничего сложного, никакой интеграции терминала в Ами, просто скрипты к кнопкам.
Первая кнопка у меня запускает Quik с автоподстановкой логина и пароля.
Вторая открывает файл эксель (там у меня расчитываются суммарные позиции).
Третья делает резервную копию папки с Amibroker со всеми формулами и чартами, ибо нечаянная утеря наработок по формулам привела бы к принятию яда. )) Копируется умно, без дублирования, только измененные папки, с итоговым логфайлом.
Всё одним нажатием кнопки, ибо скрипт рулит. Дальше напишу как быстро сделать, мож кто не знает. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
Кнопка запуска QUIK (или по аналогии другого терминала)
На профильных конфах перерыты скрипты и выбран вот этот, т.к. корректно работает. vbscript потому что понятный, видно исходный код (без червей), запускается без окна, в отличие например от bat.
Код: |
path = "info.exe"
login = "Логин"
pass = "Пароль"
set WshShell = WScript.CreateObject("WScript.Shell")
Set quik = WshShell.Exec(path)
Do Until Dummy = true
WScript.Sleep 500
Loop
Call Logon
Function Dummy
Dummy = false
If WshShell.AppActivate("Идентификация пользователя") then
Dummy = True
Exit Function
End If
End Function
Sub Logon
WshShell.SendKeys login
WshShell.SendKeys "{TAB}"
WScript.Sleep 500
WshShell.SendKeys pass
WScript.Sleep 500
WshShell.SendKeys "{Enter}"
End Sub |
Создаем в корневой папке Quik текстовый файл, называем START, расширение меняем на vbs, открываем блокнотом, копируем внутрь этот скрипт, вместо "Логин" и "Пароль" вписываем свои, кавычки оставляем, сохраняем файл, запускаем двойным кликом мыши. Должен открыться и залогиниться QUIK. Если компьютер дохловат и запуск не удался, измените цифры 500 в трех местах кода например на 5000, тогда КВИК будет успевать получать все данные корректно. Если QUIK запускается, но ругается на отсутствие ключей, вероятно файл скрипта вы положили не в корневую папку. Если всё ОК, сделайте ярлык на раб. стол, так удобно запускать руками.
Теперь, как уже описано на этом форуме ранее, создаем в TOOLS Амиброкера команду в меню - TOOLS -> Customize -> Tools, топчем NEW, называем QUIK, указываем пути к файлу, директории (обязательно, иначе КВИК запустится без ключей и справочников),
везде OK, пробуем запускать скрипт из амиброкерского меню TOOLS -> QUIK. Если всё гуд, TOOLS -> Customize -> Toolbars, топчем NEW - создаем ноую панель, называем как хотим, активируем галкой, закладка Commands, строчка TOOLS, цепляем кнопку USER DEFINED TOOL 4 (если команда QUIK расположена четвертой после CUSTOMIZE в меню TOOLS на панели Ами) и тащим мышью на нашу новую панель. Теперь не закрывая окно Customize правой кнопкой мыши топчем на новую кнопку и помадим ей губки как хотим. Проверяем, пользуемся.
Если не хотите чтобы логин и пароль лежали на компе в текстовом виде, можно комплировать файл скрипта в exe, что собственно я и сделал для себя.
Дополнения:
1. Если после четвертой строчки скрипта добавить
Код: |
WshShell.CurrentDirectory = "C:\QUIK" '(укажите свой путь в папку с Квиком) |
то можно файл скрипта размещать где угодно, оттуда и запускать.
2. Добавив в конце скрипта эмуляцию нажатия Ctrl+Shift+L получаем автозапуск вывода данных по DDE
Код: |
WScript.Sleep 1000
WshShell.SendKeys "(+^L)" |
или по аналогии другие команды горячими клавишами Квик.
Важно: Пока выполняется скрипт (а Квик неприлично долго подгружает справочники) убираем руки с клавы и мыши, ничего не жмем, чтобы не сбить фокус скрипта на Квик. |
Последний раз редактировалось: GREEN_X5 (Ср Июн 12, 2013 2:34 pm), всего редактировалось 3 раз(а) |
|
Посмотреть профиль Отправить личное сообщение |
|
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
Кнопка резервного копирования Ами например в папку в корне диска C.
В корне диска C:\ создаем папку RESERV_AMI, внутри неё создаем папку Logs. В корне папки Ами создаем файл скрипта (см. ниже) и по полной аналогии с прежней инструкцией вешаем на новую кнопку. Запускаем, если скрипт рапортует об успехе, значит в созданной папке уже копия. Если ругается, что-то сделали не так (чудес не бывает).
Путей копирования можно указать множество, в т.ч. по сетке.
Скрипт (спасибо автору MasterLin http://www.masterlin.ru за образец)
Код: |
' ========== Script Information ==========
' autor: MasterLin
' site: http://www.masterlin.ru
' description: Скрипт копирует файлы, папки и подпапки с одного источника на несколько, в сети или локально (рассылка файлов).
' При этом происходит проверка на наличие, доступность и время создания файлов. При отсутствии, либо старой версии файла
' происходит его копирование и замена на более новый.
'***********************************************
' Создание объектов оболочки и файловой системы
Set oShell = CreateObject("wscript.shell")
Set oFSO = CreateObject("Scripting.Filesystemobject")
Set WSNetwork = CreateObject("WScript.Network")
LogFolder = "c:\RESERV_AMI\Logs\" ' место расположения лог-файла
StartFolder = "..\AmiBroker\" ' откуда копируем
aEndFolder = array("c:\RESERV_AMI\") ' куда копируем
'***********************************************
' обнуление и описание счетчиков, используемых в скрипте
num_EndFolder = 0 '- общее число папок, места назначения для копируемых данных
num_EndFolder_0 = 0 '- не доступное кол-во папок из num_EndFolder
num_files = 0 '- общее число обработанных файлов
num_files_copy = 0 '- из них скопировано с заменой на новую версию
err_files_copy = 0 '- из них не скопировано в результате ошибки при работе с num_files_copy
num_files_new = 0 '- из них скопировано новых файлов
err_files_new = 0 '- из них не скопировано в результате ошибки при работе с num_files_new
num_SubFolder = 0 '- обработано папок и подпапок
num_SubFolder_copy = 0 '- из них скопировано новых папок и подпапок
err_SubFolder = 0 '- из них не скопировано в результате ошибки при работе с num_SubFolder
'***********************************************
sLogName = "LogTemp_" & Date & "_" & Time
sLogName = Replace(sLogName, ".", "_")
sLogName = Replace(sLogName, ":", "_")
sLogName = LogFolder & sLogName
Set oLogFile = oFSO.CreateTextFile(sLogName & ".log",true)
oLogFile.WriteLine "========== Script Information =========="
oLogFile.WriteLine "script name: Reserv Copy Ami"
oLogFile.WriteLine "version: 1.0"
oLogFile.WriteLine "date: 08.06.2013"
oLogFile.WriteLine "autor: Amibroker rus community"
oLogFile.WriteLine "site: http://www.AmiSite.ru"
oLogFile.WriteLine "========== Запуск скрипта ==========" & vbCrLf
'***********************************************
Set oEndFolder = CreateObject("Scripting.FileSystemObject")
For i=0 to UBound (aEndFolder)
num_EndFolder=num_EndFolder+1
If oEndFolder.FolderExists ( aEndFolder(i) ) Then
oLogFile.Writeline "Папка " & "'" & aEndFolder(i) & "'" & " доступна для работы" & vbCrLf
CopyFolder StartFolder,aEndFolder(i)
else
oLogFile.Writeline
oLogFile.Writeline "Папка " & "'" & aEndFolder(i) & "'" & " в настоящий момент не доступна. Работа с ней прекращена." & vbCrLf
WScript.Echo "Папка " & "'" & aEndFolder(i) & "'" & " в настоящий момент не доступна. Работа с ней прекращена."
num_EndFolder_0=num_EndFolder_0+1
End if
Next
oLogFile.WriteLine "========== Отчет о копировании ==========" & vbCrLf
oLogFile.WriteLine "Задано " & num_EndFolder & " целевых папок для резевного копирования данных."
oLogFile.WriteLine "Недоступно для работы целевых папок - " & num_EndFolder_0 & " шт. (см.логи выше)"
oLogFile.WriteLine "Обработано скриптом - " & num_files & " файлов."
oLogFile.WriteLine "Из них скопировано с заменой - " & num_files_copy & " шт., не скопировано в результате ошибки - " & err_files_copy & " шт."
oLogFile.WriteLine "Из них скопировано новых файлов - " & num_files_new & " шт., не скопировано в результате ошибки - " & err_files_new & " шт."
oLogFile.WriteLine "Обработано скриптом - " & num_SubFolder & " подпапок."
oLogFile.WriteLine "Из них скопировано новых подпапок - " & num_SubFolder_copy & " шт., не скопировано в результате ошибки - " & err_SubFolder & " шт."
oLogFile.WriteLine
oLogFile.WriteLine "========== Выполнение скрипта завершено ==========" & vbCrLf
WScript.Echo "Резервное копирование завершено."
Sub CopyFolder(sCopyFolder,sEndCopyFolder)
Set oFolder = oFSO.GetFolder(sCopyFolder)
Set oEndCopyFolder = oFSO.GetFolder(sEndCopyFolder)
Set colFiles = oFolder.Files
For each oFile in colFiles
'oLogFile.Writeline " Дата создания:"
oLogFile.Writeline oFile & " Дата создания:" & vbTab & oFile.DateCreated
num_files=num_files+1
If oFSO.FileExists(oFSO.BuildPath(oEndCopyFolder, oFile.Name)) Then
oLogFile.Writeline "Такой файл уже существует в папке " & oEndCopyFolder
oLogFile.Writeline "Проверка актуальность копии:"
sFileEnd = oFSO.BuildPath(oEndCopyFolder, oFile.Name)
Set oFileEnd = oFSO.GetFile(sFileEnd)
If oFileEnd.DateLastModified < oFile.DateLastModified Then
oLogFile.Writeline "Копия файла устарела, Обновление. **********" & vbCrLf
oFSO.CopyFile oFile, sEndCopyFolder & oFile.Name, True
if err.Number <> 0 then
oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear
err_files_copy=err_files_copy+1
else
num_files_copy=num_files_copy+1
End if
else
oLogFile.Writeline "Копия актуальна." & vbCrLf
End if
else
oLogFile.Writeline "Это новый файл. " & oEndCopyFolder & " Резервное копирование." & vbCrLf
oFSO.CopyFile oFile, sEndCopyFolder & oFile.Name, True
if err.Number <> 0 then
oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear
err_files_new=err_files_copy+1
else
num_files_new=num_files_copy+1
End if
End if
Next
oLogFile.Writeline "Обработка и копирование всех подпапок из папки " & oEndCopyFolder & vbCrLf
Set colSubFolders = oFolder.SubFolders
For Each oSubFolder In colSubFolders
oLogFile.Writeline "Проверка подпапки " & oSubFolder
num_SubFolder=num_SubFolder+1
If oFSO.FolderExists(oFSO.BuildPath(oEndCopyFolder, oFSO.GetBaseName(oSubFolder.Path))) Then
oLogFile.Writeline "Такая подпапка уже существует в папке " & oEndCopyFolder
oLogFile.Writeline vbCrLf & "Проверка всех файлов в подпапке: "
sSubFolderEnd = oFSO.BuildPath(oEndCopyFolder, oFSO.GetBaseName(oSubFolder.Path)) & "\"
CopyFolder oSubFolder, sSubFolderEnd
' oLogFile.Writeline
else
oLogFile.Writeline "Такая подпапка отсутствует в папке " & oEndCopyFolder & " Резервное копирование." & vbCrLf
oFSO.CopyFolder oSubFolder, sEndCopyFolder, True
if err.Number <> 0 then
oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear
err_SubFolder=err_SubFolder+1
else
num_SubFolder_copy=num_SubFolder_copy+1
End if
End if
Next
End Sub |
|
Последний раз редактировалось: GREEN_X5 (Ср Июн 12, 2013 8:56 pm), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение |
|
121212
Зарегистрирован: 13.11.2012
Сообщения: 12
Откуда: 111111
|
Все хорошо работает, как определить иконку кнопки? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
121212
Зарегистрирован: 13.11.2012
Сообщения: 12
Откуда: 111111
|
Скрипт работает хорошо, резервирует. Как сохранить полную структуру каталога Ами? Как нужно изменить скрипт для резервирования в ZIP или др сжатом формате? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
Otokar писал(а): |
Все хорошо работает, как определить иконку кнопки? |
Резервируется вся папка Amibroker, если вы пути не меняли и файл скрипта положили в корень папки Amibroker. Не редактируются только настройки реестра, но это можно дописать код. Загляните в резервную папку и сравните с исходной - чего там не хватает??
По кнопке, как и написано выше - вызовите и не закрывайте окошко Customize из меню Амиброкера. Пока оно висит открытым, можно нажать на кнопку правой мышей и найти там все настройки - хоть выбирайте иконку, хоть свою рисуйте.
По зип архиву посмотрю позже, есть вроде готовый код. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
121212
Зарегистрирован: 13.11.2012
Сообщения: 12
Откуда: 111111
|
Все папки резервируются. Подкаталоги папки DATA первоначального АМИ разворачиваются в корень каталога резерва. Смотри Screen |
|
|
Посмотреть профиль Отправить личное сообщение |
|
121212
Зарегистрирован: 13.11.2012
Сообщения: 12
Откуда: 111111
|
По изображению кнопки получилось. Спс |
|
|
Посмотреть профиль Отправить личное сообщение |
|
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
Здесь скрипт архивации
http://yadi.sk/d/D4GtvRzQ5kfpG
Всю папку положить в корень диска C:\, внутри экзешник архиватора 7z и файл скрипта, в котором нужно проверить путь к папке Амиброкера (строка 17 кода). Сейчас
Код: |
StartFolder = "C:\Program Files\AmiBroker\" |
у кого то может быть
Код: |
StartFolder = "C:\Program Files (x86)\AmiBroker\" |
или ещё как-н. Проверить имя тома, "С:\" или нет. Цеплять к кнопке Ами как обычно. Скрипт сам обращается к архиватору, по окончании работы рапортует и напоминает куда положил. При повторной архивации в течении дня переписывает архив заново. На следующий день уже будет создавать другой архив (в названии архивов дата). Накапливает логи в той же папке. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
Otokar писал(а): |
Все папки резервируются. Подкаталоги папки DATA первоначального АМИ разворачиваются в корень каталога резерва. Смотри Screen |
Попробуй вот в этой строчке косой слэш поставить
было
Код: |
StartFolder = "..\AmiBroker" ' откуда копируем |
стало
Код: |
StartFolder = "..\AmiBroker\" ' откуда копируем |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
121212
Зарегистрирован: 13.11.2012
Сообщения: 12
Откуда: 111111
|
Не працює. Попробую сам, ты дал направление мысли, за что - дякую. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
Otokar писал(а): |
Не працює. Попробую сам, ты дал направление мысли, за что - дякую. |
Та нема за що.
хз, у меня все работает. Путь нужно просто правильно прописать. И слэш косой в конце пути.
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
GREEN_X5
Зарегистрирован: 13.04.2012
Сообщения: 136
|
Пришел к тому, что мне удобен одновременный запуск QUIK и Амиброкер кликом по одному ярлычку на рабочем столе. Поэтому модифицировал код vbs.
Создаем текстовый файл, называем его например start, копируем туда код, в первые четыре строчки подставляем свои логин, пароль и пути, сохраняем, меняем расширение файла на vbs, получается имя файла start.vbs , помещаем файл в папку QUIK, на рабочем столе создаем ярлык для этого файла.
Кликаем по ярлыку - запускаются QUIK (с автоподстановкой пароля) и Амиброкер. Теперь код проверяет наличие уже запущенных процессов, поэтому если какая-то программа уже запущена - второй раз не запускается. Если уже были запущены обе - не запустится ничего.
Внимание! Для корректной автоподстановки логина и пароля в QUIK логин и пароль должны содержать только цифры!!!
Код: |
login = "111" 'Логин для Quik
pass = "222" 'Пароль для Quik
patchQUIK="C:\QUIK\info.exe" 'Путь к Quik
patchAMI="C:\Program Files (x86)\AmiBroker" 'Путь к Амиброкер
Set objService = GetObject("WinMgmts:\\.\Root\CIMV2")
Set colProcesses = objService.ExecQuery("select * from Win32_Process WHERE Name='Winros.EXE'")
If colProcesses.Count < 1 Then
set WshShell = WScript.CreateObject("WScript.Shell")
createobject("Wscript.Shell").run patchQUIK
Do Until Dummy = true
WScript.Sleep 100
Loop
Call Logon
Function Dummy
Dummy = false
If WshShell.AppActivate("Идентификация пользователя") then
Dummy = True
Exit Function
End If
End Function
Sub Logon
WshShell.SendKeys login
WshShell.SendKeys "{TAB}"
WScript.Sleep 100
WshShell.SendKeys pass
WScript.Sleep 100
WshShell.SendKeys "{Enter}"
End Sub
WScript.Sleep 100
End If
Set objService = GetObject("WinMgmts:\\.\Root\CIMV2")
Set colProcesses = objService.ExecQuery("select * from Win32_Process WHERE Name='Broker.EXE'")
If colProcesses.Count < 1 Then
Set wshShell = WScript.CreateObject("WScript.Shell")
WshShell.CurrentDirectory = patchAMI
createobject("Wscript.Shell").run "Broker.exe"
End If |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|