Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Закладки » Программирование "удобняшек" на VBScript

Модерирует : ShIvADeSt

ShIvADeSt (12-07-2011 15:12): http://forum.ru-board.com/topic.cgi?forum=33&topic=11963#1  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112

   

alroy

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цикл While … Wend
 
                                             
 
                                          While условие
 
                                                 тело цикла
 
                                          Wend
 
 
 
В цикле While … Wend условие выполнения тела цикла проверяется перед началом очередной итерации. Если ( условие ) равно true, то тело цикла выполняется, в противном случае цикл завершается.

Всего записей: 59 | Зарегистр. 15-06-2005 | Отправлено: 11:45 28-05-2007
afandi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Коллеги срочно ножно узнать такую весч,  
 
я запускаю некую прогу из скрипта которая выполняет некие действия, мне в скрипте необходимо нужно дождатся когда программ завершит свою работу, не представляется возможним как узнать время завершения запущенной программы из скрипта.  
по каким признакам можно определить что программа запущенная из скрипта завершила свои действия?  
понимаю что вопрос абсурдный, хотелось ухватить какую нить идею что бы хотя бы по косвенным признакам можно было узанть что программа закончила свою работу.
 
 

Всего записей: 25 | Зарегистр. 21-12-2005 | Отправлено: 12:29 29-05-2007
megamozg13



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
afandi
 
object.Run (strCommand, [intWindowStyle], [bWaitOnReturn])  
bWaitOnReturn = TRUE выставляй

Всего записей: 313 | Зарегистр. 27-07-2004 | Отправлено: 12:35 29-05-2007
afandi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
т.е вы предлагаете вот так:  
 
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run("marcp.exe",3,TRUE)  
 
Но у меня в данный момент запуск идет так:
 
Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("marcp.exe")
WScript.Sleep 3000
WshShell.AppActivate(WshExec.ProcessID)
WshShell.SendKeys "{F10}"
WshShell.SendKeys "{RIGHT 7}"
WshShell.SendKeys "{ENTER}"
WshShell.SendKeys "{DOWN 3}"
WshShell.SendKeys "{ENTER}"
WshShell.SendKeys "{TAB 5}"
WshShell.SendKeys "{ENTER 2}"
Здесь эмулируется запуск вичисления в программе marcp.exe юзером.  
Если я применю метод: WshShell.Run("marcp.exe",3,TRUE)  
как мне переделать вышеописанный мой скрипт?  
 
Я попитался отправить команду Alt+F4, так как в некоторых программах эта команда обрабативается программой после завершения выполнения текущей операции, но в моем случае при отправке команды Alt+F4 программа прекращает вычисления сразу и выключается.  

Всего записей: 25 | Зарегистр. 21-12-2005 | Отправлено: 13:14 29-05-2007
megamozg13



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
afandi

Цитата:
Если я применю метод: WshShell.Run("marcp.exe",3,TRUE)

в таком случае ты не сможешь передать ей ничего, т.к. на этом этапе скипт будет ждать закрытия программы.
 
как вариант, использовать "Sleep" перед передачей "Alt+F4", но только если ты сможешь предугадать сколько нужно времени на вычисления...
 
 

Всего записей: 313 | Зарегистр. 27-07-2004 | Отправлено: 13:50 29-05-2007
afandi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да я могу примерно оценить время работы программы +-5 минут погрешность.  Но этот механизм не надежен к сожалениею.  
 
В прежные годы программировал на Delphi в связи с этим вспомнил, что в сестеме программы отправляют кучу всяких систменых сообщении.  
 
Поэтому нельзя ли например, отправить программе в процессе ее работы отправить какое либо системное сообщение на которое (например) программы ответить каким либо сообщением, и это сообщение использовать как признак того что программа еще работает и свою работу не закончила?
 
 

Всего записей: 25 | Зарегистр. 21-12-2005 | Отправлено: 13:58 29-05-2007
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
afandi

Код:
 
Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")
 
Set oExec = WshShell.Exec("calc")
Do While oExec.Status = 0
     WScript.Sleep 100
Loop
 
WScript.Echo oExec.Status
 

oExec (WshScriptExec) имеет свойства

Цитата:
 
ExitCode Property  
ProcessID Property  
Status Property  
StdErr Property  
StdIn Property  
StdOut Property  
Terminate Method  
 


Цитата:
 
ExitCode
Executables set an exit code when they finish running. This conveys the status information when a process ends. Often, it is used to send an error code (or some other piece of information) back to the caller. If the process has not finished, the ExitCode property returns 0. The values returned from ExitCode depend on the application that was called.
 

Подробнее

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 14:26 29-05-2007 | Исправлено: AndVGri, 14:47 29-05-2007
afandi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В моем случае я все таки нашел признак по которому можно определить когда программа завершила вычисления и я могу выгрузить ее через команду terminate.
 
В общем после завершения вчисления программа выдает окошко с текстом  
И по команде WshShell.SendKeys "{TAB}" у меня выделяется весь этот текст, теперь осталось скопировать его. вот и вопрос, как ентот текст скопировать  и проверить значение?
Если по каманде копирования в буфер не попадает искомый текст значить программа еще работает
 
так как скопировать текст из поля на котором в данный момент размещен фокус?

Всего записей: 25 | Зарегистр. 21-12-2005 | Отправлено: 14:50 29-05-2007
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
afandi
А чем тебя oExec.Status = 0 не устроила?

Цитата:
 
 
The Status property returns a value from an enumerated type.  
 
WshRunning ( = 0)
The job is still running.
 
WshFinished ( = 1)
The job has completed
 


Цитата:
ак как скопировать текст из поля на котором в данный момент размещен фокус

Пошли ему "%A", затем "^C"
Получить скопированное

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 15:13 29-05-2007 | Исправлено: AndVGri, 15:14 29-05-2007
afandi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как на WSH поместить содержимое CLIPBOARD в переменную?.
Нашел тут примерчик http://forum.developing.ru/archive/index.php/t-1448.html
//JScript
 
unction ReadClipboard(){
var texxt,
oIE = new ActiveXObject("InternetExplorer.Application");
oIE.navigate ("about:blank");
oIE.visible = 0;
while(oIE.Busy){ WScript.Sleep(10); }
texxt = oIE.Document.parentWindow.clipboardData.getData ("Text");
oIE.Quit();
return (texxt);
}
 
function WriteClipboard(mytext) {
var oIE = new ActiveXObject("InternetExplorer.Application");
oIE.navigate ("about:blank");
oIE.visible = 0;
while(oIE.Busy){ WScript.Sleep(10); }
oIE.Document.parentWindow.clipboardData.setData ("Text", mytext );
oIE.Quit();
}
 
А как эту кухню переделать в Wbscript?
 
Добавлено:
 
 
>> А чем тебя oExec.Status = 0 не устроила?  
не устраивает тем что, программа которую запускаю из скрипта, сама не вырубается по заверешнию вычисления, эта задача лежит на скрипте
 
 
Добавлено:
Вот мой проблемный скрипт господа...
Set objHTM = CreateObject("htmlfile")  
Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("C:\Program Files\Inform-Systema\MarcSQL 1.8 MARC21\bin\marcp.exe")
WScript.Sleep 3000
WshShell.AppActivate(WshExec.ProcessID)
WshShell.SendKeys "{F10}"
WshShell.SendKeys "{RIGHT 7}"
WshShell.SendKeys "{ENTER}"
WshShell.SendKeys "{DOWN 3}"
WshShell.SendKeys "{ENTER}"
WshShell.SendKeys "{TAB 5}"
WshShell.SendKeys "{ENTER 2}"
 While Not WshExec.status = 1 'Пока программа работает....
   WScript.Sleep 1000         'проверяем каждые 3 секунды
   WshShell.SendKeys "{TAB}"  'Попитаемся попасть на текст
   'WshShell.SendKeys "^{INS}" 'И скопировать его Ctrl+Ins
   WshShell.SendKeys "^C"  
   'Нужно еще буфер предидущий почистит а как сделать?
   strTXT = objHTM.ParentWindow.ClipboardData.GetData("text")  
   If strTXT <> "" Then   WScript.Echo strTXT
   'strTXT в этой переменной все таки не оказывается искомого текста а что то другое
 Wend
'WshExec.Terminate
 
Добавлено:
Коллеги помогите мне разобратся
 
strTXT = objHTM.ParentWindow.ClipboardData.GetData("text")  
If strTXT <> "" Then MsgBox strTXT
 
почемуто показывает текст "strTXT" а не содержимое переменной strTXT?

Всего записей: 25 | Зарегистр. 21-12-2005 | Отправлено: 15:15 29-05-2007
megamozg13



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
strTXT = objHTM.ParentWindow.ClipboardData.GetData("text")  
If strTXT <> "" Then WScript.Echo strTXT

Всего записей: 313 | Зарегистр. 27-07-2004 | Отправлено: 16:40 29-05-2007
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
megamozg13
И чем
Цитата:
WScript.Echo strTXT
отличается от
Цитата:
MsgBox strTXT

в плане отображения текстовой строки?

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 17:05 29-05-2007
afandi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
[/q]
[q]И чем
Цитата:
WScript.Echo strTXT
отличается от
Цитата:
MsgBox strTXT
 
в плане отображения текстовой строки?  

 
Не знаю, но в какой то степени проблему решил так  
 
Set ie=createobject("internetExplorer.application")
ie.navigate "about:blank"
ie.document.parentwindow.clipboardData.setData "Text", ""
.........
   WshShell.SendKeys "^{INSERT}" '
   strTXT = ie.document.parentwindow.clipboardData.getData("Text")
   If strTXT <> "" Then MsgBox strTXT
Вот теперь текст копируется в буфер нормально и его можно записать в переменную strTXT
только к сожалению русский текст отбражается вот так  "&#207;&#238;&#241;&#242;&#240;&#238;&#229;&#237;&#232;&#229; &#241;&#235;&#238;&#226;&#224;&#240;&#229;&#233; &#231;&#224;&#226;&#229;&#240;&#248;&#229;&#237;&#238; &#243;&#241;&#239;&#229;&#248;&#237;&#238;!" а не как положено, как решить сию проблему?
 
 
Добавлено:
 что то текст с диактрическими символамы запостился с с кодами  
На этой странице есть полное описание как работать с буфером
http://www.potolook.ru/blog/p,213/
 
Добавлено:
Все это конечно хорошо,  
а как будет работать скрипт который запускаемы по расписанию на заблокированной (ctrl+alt+del) машине при использованию методов  WshShell.SendKeys ?

Всего записей: 25 | Зарегистр. 21-12-2005 | Отправлено: 17:20 29-05-2007
ViSiToR



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Функция IniRead - Позволяет читать из типичного Ini-файла данные, основываясь на имени файла, имени секции, и ключа:

 

Код:
Function IniRead(IniFile, SectionName, Key, Default)
    Dim fso, hFile, Line, SplitArr
    Set fso = CreateObject("Scripting.FileSystemObject")
    If Not fso.FileExists(IniFile) Then
        IniRead = -1
        Exit Function
    End If
 
    Set hFile = fso.OpenTextFile(IniFile, 1, False)
    
    Do While hFile.AtEndOfStream <> True
        Line = hFile.ReadLine
        If StrComp("[" & SectionName & "]", Line, 1) = 0 Then
            While hFile.AtEndOfStream <> True
                Line = hFile.ReadLine
                SplitPos = InStr(Line, "=")-1
                If InStr(Line, "=") <> 0 Then
                    StrToComp = Left(Line, SplitPos)
                Else
                    StrToComp = Line
                End If
                If StrComp(StrToComp, Key, 1) = 0 And InStr(Line, "=") > 0 Then
                    SplitArr = Split(Line, "=")
                    CommentPos = InStr(SplitArr(1), ";")-1
                    If InStr(SplitArr(1), ";") <> 0 Then
                        IniRead = Left(SplitArr(1), CommentPos)
                    Else
                        IniRead = SplitArr(1)
                    End If
                    hFile.Close
                    Exit Function
                End If
            Wend
            IniRead = Default
            hFile.Close
            Exit Function
        End If
    Loop
    hFile.Close
    IniRead = Default
End Function

 
Синтаксис:
 
IniRead("путь\к\Ini-файлу.ini", "Имя секции", "Ключ" , "Значение по умолчанию")
 
Типичное содержание Ini-Файла:
 
[Имя секции]
Ключ=Значение

 
Возвращаемые значения:
 
Ini-файл не найден = -1
Не найдена секция/ключ = Значение по умолчанию
Если найдена секция и ключ = возвращается значение ключа

----------
ViSiToR a.k.a CreatoR
CreatoR это не ник, CreatoR это стиль жизни!

Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 04:18 05-06-2007 | Исправлено: ViSiToR, 04:19 05-06-2007
Rush

Уже за тридцать...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ViSiToR
Интересная функция, но несколько перегруженная лишним балластом.
По-моему, можно несколько упростить ее. Примерно так:

Код:
Function IniRead(IniFile, SectionName, Key, Default)  
    Dim fso, hFile, Line, SplitArr, Value
    Set fso = CreateObject("Scripting.FileSystemObject")        
       If Not fso.FileExists(IniFile) Then
           IniRead = -1
           Exit Function
       End If    
       Set hFile = fso.OpenTextFile(IniFile, 1, False)        
       Do While Not (StrComp("[" & SectionName & "]", Line, 1) = 0 Or hFile.AtEndOfStream)
           Line = Trim(hFile.ReadLine)
       Loop        
       Do While Not hFile.AtEndOfStream
           Line = Trim(hFile.ReadLine)
           If Line <> Empty Then SplitArr = Split(Line, "=")
           If (StrComp(SplitArr(0), Key, 1) = 0 And InStr(Line, "=") > 0) Or (InStr(Line, "[") = 1 And InStr(Line, "]") = Len(Line)) Then Exit Do
       Loop        
       If hFile.AtEndOfStream Or (InStr(Line, "[") = 1 And InStr(Line, "]") = Len(Line)) Then
           IniRead = Default
       Else
           Value = Split(SplitArr(1), ";")
           IniRead = Value(0)
       End If
       hFile.Close
End Function
 
В Value(1) можно комменты смотреть. Вдруг надо...
 
Добавлено:
Кстати, теперь, если закомментировать ключ, а в другой секции (дальше расположенной) есть такой же, то скрипт уже не будет считывать его.

Всего записей: 3551 | Зарегистр. 20-11-2003 | Отправлено: 19:34 05-06-2007
ViSiToR



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Rush

Цитата:
По-моему, можно несколько упростить ее

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

----------
ViSiToR a.k.a CreatoR
CreatoR это не ник, CreatoR это стиль жизни!

Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 23:27 05-06-2007
Zver1978

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа помогите плиз, есть сервак на нем создана гора папок с разными правами доступа и с разнымми группами юзеров, никто не знает какая папка к какой группе предназначена, попытался я скрипт написать,чтобы посмотреть какая папка к какой группе относится и какие права доступа и перенести полученную инфу в  Эксель, но что то не выходит каменный цветок может кто заморачивался такой вещью! есть хоть какое-то подобие скрипта?

Всего записей: 1 | Зарегистр. 06-06-2007 | Отправлено: 10:53 06-06-2007
distance

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
кстати по поводу ini-файлов.
пользуюсь такой:

Код:
String.prototype.trim = function() { return( this.replace(/^\s*/,"").replace( /\s*$/,"") ); }
 
Object.prototype.fromIni = function(iniFile)
{
    var reSection = /\s*\[([_\w\d]+)\]/;
    var reVariable = /\s*(.+?)\s*=\s*(.*?)(;|\\|$)/;
    var reComment = /^\s*(;|\\|$)/;
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var fp = fso.OpenTextFile(iniFile);
    var section = this;
    while (!fp.AtEndOfStream)
    {
        var arr;
        var buf = fp.ReadLine();
        // if comment?
        if (reComment.test(buf))
            continue;
        // if section?
        if ((arr = reSection.exec(buf)) != null)
        {
            this[arr[1]] = section = {};
        }
        // if variable?
        if ((arr = reVariable.exec(buf)) != null)
        {
            section[arr[1]] = arr[2].trim();
        }
    }
    fp.Close();
}
 

она конечно простая до безобразия и многие проверки опущены (ошибки ловятся в parent try-catch блоке) но пользоваться довольно удобно. Например для такого ini:
[pre]
[Common]
Version = 1.0 ; version
[/pre]
можно записать так:

Код:
var a = {};
a.fromIni("test.ini");
WScript.Echo(a.Common.Version);

Получим, соответственно: 1.0
 
Добавлено:
Zver1978
Запретить доступ всем. по мере возникновения воплей - открывать и прокотолировать

Всего записей: 878 | Зарегистр. 28-03-2004 | Отправлено: 11:07 06-06-2007
ViSiToR



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
distance

Цитата:
пользуюсь такой:

Если не ошибаюсь, это код JScript, синтаксис немного другой, и имя топика тоже немного другое подразумивает
 
Но думаю если по теме, то вариация на мою функцию от Rush самая удачная .


----------
ViSiToR a.k.a CreatoR
CreatoR это не ник, CreatoR это стиль жизни!

Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 11:17 06-06-2007
distance

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ViSiToR

Цитата:
и имя топика тоже немного другое подразумивает

это дискриминация
я например с синтаксисом vbs полохо знаком, а на jscript удобняшки пишутся ничуть не хуже. думаю, тему стоило бы назвать что-то вроде "... с использованием Windows Script Host"

Всего записей: 878 | Зарегистр. 28-03-2004 | Отправлено: 11:55 06-06-2007
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Закладки » Программирование "удобняшек" на VBScript
ShIvADeSt (12-07-2011 15:12): http://forum.ru-board.com/topic.cgi?forum=33&topic=11963#1


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru