Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Программирование "удобняшек" на VBScript

Автор: bomzzz
Дата сообщения: 24.09.2009 13:50
WaitWindow.exe 2,00 КБ (2 048 байт)
прога работает следующим образом будучи просто запущена, она ничего не делает просто выходит. будучи запущена с командной строкой с /ИМЕНЕМ ОКНА, она сама выводит окно на экран в активном состоянии, делает его активным(!), на всякий случай, и выходит. возвращаемое значение - в случае если запущена без параметра - просто некое большое число. в случае удачного отрабатывания - окно появилось и сделалось активным возвращается 1. ожидает появление окна 60 секунд, но если комп будет тормозить это время пропорционально увеличится, так что даже многовато - в случае выхода времени ожидания код возврата 0.
теперь об ИМЕНИ ОКНА, это то что мы видим вот тута наверху на синеньком слева, сразу за иконкой

Калькулятор
пример WaitWindow.exe /Калькулятор
бывают ньюансы, например не смотря на то что у программы USDownloader мы видим
Universal Share Downloader v1.3.5.3 использовать все равно надо Universal Share Downloader, случай частный - но все же в каждом конкретном случае может понадобится настройка. так как VBS скрипты не предпологают использование окон использовать как параметр класс окна мне показалось излишним. у консольных приложений в этом месте обычно путь к программе в досовском формате. не смотря на возможные пробелы в имени, использование кавычек не требуется - даже противопоказано.
WaitWindow.exe /Universal Share Downloader
WaitWindow.exe /C:\DOCUME~1\BOMZ\0016~1\NONAME.EXE
WaitWindow.exe /Download Master 5.5.13.1173
WaitWindow.exe /NetTransport
может пригодится как раз для надежной отправки в окна всяких нажатий клавиш при помощи SendKey - запускать ее WshShell.Run вместо Sleep .

Цитата:

Set WshShell = CreateObject("WScript.Shell")
RetCode = WshShell.Run("Calc.exe", 1, False)
RetCode = WshShell.Run("WaitWindow.exe /Калькулятор", 1, True)
True - ожидаем возвращения

чтоб проверить - загрузите процессор на 100 процентов, например начните архивировать фильм полтора два гига, или лучше в мазиле откройте 50 вкладок, чтоб оперативку подъедать начало и проверьте как связка будет работать.
проверил на калькуляторе, блокноте, даунлоад мастере, US даунлоадере, КМПлеере, консольном окне 16 битного приложения. в случае если запущено несколько окон одной программы - действия будут производится только с одним окном с таким приоритетом: с активным, с "верхним", с последним запущеным.
Автор: Gavigor
Дата сообщения: 24.09.2009 14:24
/
Автор: bomzzz
Дата сообщения: 24.09.2009 14:31
гавигорка приветик

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

WinClassShow.exe 2,50 КБ (2 560 байт)
программа отладчик, работает следующим образом, запускается с параметром имени окна

Цитата:

WaitWindow.exe /Universal Share Downloader
WaitWindow.exe /C:\DOCUME~1\BOMZ\0016~1\NONAME.EXE
WaitWindow.exe /Download Master 5.5.13.1173
WaitWindow.exe /NetTransport

изучаемую программу лучше всего запустить сразу, в противном случае ожидает появления окна 10 секунд. выдает следующие сообщения. на примере WinClassShow.exe /Download Master 5.5.13.1173
в случае если не дождалась появления окна в течении 10 секунд (например если имя было неправильно определено)

в случае если было окно обнаружено выводит в сообщении класс окна (то есть мы определили имя окна правильно для наших целей) - некую внутренню константу виндовз

в случае если была запущена без параметра


в принципе можно добавить чтоб окно поверх других окон делалось - но это в принципе чревато косяками и накладками. и срабатывание на имя окна лучше - потому что в случае класса окна она бы срабатывала на все окна такого класса

альтернатива
http://www.computerra.ru/gid/rtfm/system/272855/
http://www.commandline.co.uk/cmdow/cmdow.zip
консольная утилита размером в 31 кб, включающая порядка 30 команд управления окнами приложений в операционных системах Windows NT4/2000/XP/2003 без использования мыши. Программа не требует установки и состоит всего из одного файла cmdow.exe, опции запуска которого разработчик разделил на четыре группы, в зависимости от области применения приложения.
Вот тут сразу правильные имена окон выводятся
Автор: mozers
Дата сообщения: 25.09.2009 09:39
SANIOK_AV
Цитата:

Цитата: помощью планировщика
тоже не пойдёт...((
Автор: SANIOK_AV
Дата сообщения: 25.09.2009 11:30
mozers

Цитата:
@echo off
SCHTASKS /CREATE /RU admin /RP passw /SC once /TN tmp /TR 123.bat /ST 00:00:00
SCHTASKS /RUN /TN tmp

супер!
если ставишь /SC once то задание после выполнения удаляется я так понял?
и почему время начала: /ST 00:00:00 ?

только вот опять пароль в открытом виде передаётся...(((
Автор: TYMAH3003
Дата сообщения: 25.09.2009 14:32
А подскажите как с помощью скриппа выключить службы Винды к примеру "диспечер очереди печати"
Автор: bomzzz
Дата сообщения: 25.09.2009 15:02
это скорее всего нужно через вми делать. чета не припомню чтоб вбс скрипы службами управляли напрямую.
Автор: SANIOK_AV
Дата сообщения: 25.09.2009 15:25
TYMAH3003
записать в реестр
HKLM\SYSTEM\CurrentControlSet\Services\Spooler\Start: 0x00000004
(отключение службы (disable))
Добавлено:

наверное так:


Цитата:
Set WshShell = CreateObject("WScript.Shell")
myKey = "HKLM\SYSTEM\CurrentControlSet\Services\Spooler\Start"
WshShell.RegWrite myKey,4,"REG_DWORD"
Set WshShell = Nothing



Добавлено:
а если просто остановить службу то так:


Цитата:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name='spooler'")

For Each objService in colServiceList
errReturn = objService.StopService()
Next


а батником вобще остановить просто:


Цитата:
net stop spooler

Автор: mozers
Дата сообщения: 25.09.2009 16:43
bomzzz
Цитата:
чета не припомню чтоб вбс скрипы службами управляли
Напоминаю:
Код: Set objShellApp = CreateObject("Shell.Application")
Serv = "haspnt"
If objShellApp.ServiceStop(Serv, false) = 0 Then
MsgBox "НЕ удалось остановить сервис " & Serv & "!", vbInformation
Else
MsgBox "Сервис " & Serv & " успешно остановлен!", vbInformation
End If
Автор: bomzzz
Дата сообщения: 25.09.2009 17:17
ну я не самую удадачную книгу прочитал - краткую. Руководство разработчика на WSH 2.0
остальное надо рыться в справочных руководствах
Автор: Yuurk
Дата сообщения: 26.09.2009 07:00
Всем привет. Столкнулся с такой задачей: надо записать ADO RecordSet в текстовое поле объекта. Идея такая - через XML.


Код:
Set DOM = CreateObject ("MSXML.DOMDocument")    
Set Reestr = CreateObject ("ADODB.Recordset")

Reestr.Save DOM, 1
Reestr.Close    
Reestr.Open DOM.xml
Автор: mozers
Дата сообщения: 26.09.2009 16:21
Yuurk
Цитата:
надо записать ADO RecordSet в текстовое поле объекта

Чой то уж очень размазано сформулирована задача. Непонял. А вот тут и тут - все очень понятно.
Автор: Wu Tang
Дата сообщения: 27.09.2009 23:08
Привет.
Помогите написать vbs для запуска по пути:
%windir%\reboot.exe
И такой же, только автоудалением себя.
Заранее спасибо.
Автор: Yuurk
Дата сообщения: 28.09.2009 05:30

Цитата:
Очень размазано сформулирована задача.

Есть форма, есть соответствующий ей объект.
1. У объекта есть различные поля (атрибуты) ("Дата создания", "ФИО", "Должность" и тд.). Также у этого объекта есть текстовое поле.
2. На форме есть табличка, ДатаСоурсом у которой выставлен ADO DataSet. В рантайме генерирую RecordSet для того, чтобы подсунуть его в DataSet.
Все данные формы надо хранить в 1 объекте. Для того, чтобы хранить динамическую таблицу (набор столбцов всегда различный) в объекте - использую XML. Записать в поле я могу, а вот считать - не получается. Собсно задача: РекордСет заполнить из XML, созданного им же. Ошибку указал.
Автор: TYMAH3003
Дата сообщения: 28.09.2009 10:03
Подскажите такой скриптик рассылки файла по сети,, Локальная сеть на 20 компов,,

есть файл D:\reklama.txt ,,,нужно этот файл разослать на все 20 компов в корень

диска D: ,... Возможно ли такое осуществить,,?
Автор: bomzzz
Дата сообщения: 28.09.2009 10:10
если папки сделать общими не вижу препятствий
для етага должна быть включена служба сервера в системе, расшарить можно в свойствах папки или использовать специальный софт, который еще дополнительный сервис организует делая это все более похожим на фтп.
Автор: TYMAH3003
Дата сообщения: 28.09.2009 11:09
bomzzz
Да в ручную раскинуть не проблема ,,..дело в автоматизации 20 а если 100 компов ,.проще же запустить скрипт ,,.только написать знаний не хватает в этой области,,.если кому не в напряг черканите на vbs
Автор: bomzzz
Дата сообщения: 28.09.2009 11:29

Цитата:

Copy
Синтаксис:
Copy(<Destination>,<Overwrite>)
Назначение:
Копирует файл в указанное место.
Параметры:
<Destination> - строка, путь (куда копировать).
<Overwrite> - необязательный, булево (число). Заменять файл, если он существует (True), или нет (False).
Описание:
Без комментариев.
Пример:
Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.GetFile("C:\autoexec.bat")
File.Copy "D:\"
File.Copy "D:\Copy of autoexec.bat"

путь - путь к папке
Автор: TYMAH3003
Дата сообщения: 28.09.2009 12:09
bomzzz
НЕНЕ не этот скрипт нужен копирывать с Д диска на С .,,,,, есть локальная сеть 20 машин на каждой открыт полеый доступ на запись файлов, 3 диска С D E,,. и всё больше ничё не извесно ни айпи ни название компа в сети ,,,,скрип должен сам сканировать сеть на наличие машины и записывать на С диск файл reklama.txt ,,вот как всё непросто(
Автор: bomzzz
Дата сообщения: 28.09.2009 12:22
ну так перебери все ип из диапазона - в сети 20 машин значит всего 255 вариантов
Автор: TYMAH3003
Дата сообщения: 28.09.2009 12:35
а разве 255.,,,
192.168.111.122 думаю всё же их больше , в разы,,,,,,,,, я 0 в vbs,,.

Вот что я нарыл только не всё работает,.. нужно исправить что -то

Название темы звучало так "Перебор компьютеров в лок. сети через "Сетевое окружение""
В конце работы скрипта появляются имена локальных компов "Comp1", "Comp2" домены их,,,,,,,может это возможно использывать ,,,,,,. скрипт работает около 40 сек то есть идёт сканирование! ,,,то есть домен есть осталось проверить диски на разрешение копирывания в данном домене,,,. или автоматом делать копирывание файла на диски и где есть доступ файл скопируется...

Код: Set Shell = CreateObject("Shell.Application")
'получение папки "Сетевое окружение"
Set objFolder = Shell.NameSpace("::{208D2C60-3AEA-1069-A2D7-08002B30309D}")
'получение папки "Вся сеть"
Set objFolder = objFolder.Items().Item("EntireNetwork").GetFolder
'получение папки "Microsoft Windows Network"
For Each objItem In objFolder.Items()
If objItem.Name = "Microsoft Windows Network" Then
Set objFolderNetwork = objItem.GetFolder
End If
Next
'перебор доменов и рабочих групп
For Each objItem In objFolderNetwork.Items()
If objItem.IsFolder Then
Set objFolder = objItem.GetFolder
'перебор компьютеров
For Each objSubItem In objFolder.Items()
WScript.Echo objSubItem.Name
Next
End If
Next
Автор: bomzzz
Дата сообщения: 28.09.2009 13:19
если у тебя болванка есть наверняка кто то поможет.
вариантов конечно гораздо больше
10.168.0-255.0-255 192.168.0-255.0-255
и еще есть адреса зарезервированные под локальные с 172 кажется. но так как сеть всего из 20 компов - заивист конечно от того как она построена.
Автор: Yuurk
Дата сообщения: 28.09.2009 13:39
Просто Reestr.open DOM надо было(
Автор: TYMAH3003
Дата сообщения: 28.09.2009 14:06
bomzzz
Первый скрипт сканирует всё ок выдаёт имена машин "Dima" "MAX"

А вот как его дальше применить типа Dima\\C: D: и загнать в скрипт, а само копирывание файла вроде просто,, если путь есть,, задавать нефиксированно ,,но как это всё ОБЪЕДИНИТЬ в одно хз.,.

Yuurk

А что про это поподробнее можешь "Reestr.open DOM"
Автор: bomzzz
Дата сообщения: 28.09.2009 14:08
полно всяких прог для администрирования локальной сети, сразу со сканированием, массовой рассылкой и прочими наворотами. конкретно какие уже не помню - провайдера давно сменил у которого широко использовались эти вещи.

я эти функции вбс не использовал и у нас в сетке нету "общих ресурсов" проверить не на чем. у нас п2п и фтп. так что ничего не могу сказать по этому поводу.
Автор: TYMAH3003
Дата сообщения: 28.09.2009 14:32
bomzzz

С прогами то понятно что они есть всякие,,,. но тут дело не в прогах,,.. нужно всё по тихому делать 2 файла 1vbs и reklama.txt ,,.и всё без лишнего софта,.. типа пришёл увидел разослал 1 нажатием ENTERa )))

Лан ждём у кого повыше познания в VBS
Автор: mozers
Дата сообщения: 28.09.2009 21:13
TYMAH3003
Проще батником все сделать. Если этот скриптик у тебя нормально отрабатывает, то воткнуть в него копирование - пара пустяков.
Можно, конечно, и на VBS/JS переписать, но смысл не поменяется - только кода будет больше.

Yuurk
Это - взрослый вопрос. А форум, в основном - детский. Думаю что тут побыстрее ответят.

Автор: Starley25
Дата сообщения: 30.09.2009 09:55
Господа, нвоял скриптик, который по сути дела вычленяет последнюю строку из фйла и проверяет наличие в строке фразы YES, так вот вопрос каким образом можно реализовать подсчет количества этих YES в строке? (он кстиати еще считает количество строк в файле).
Код:
Dim filesys, readfile, contents, linumber, Fined
Set filesys = CreateObject ("Scripting.FileSystemObject")
Set readfile = filesys.OpenTextFile("c:\SecEvtLog.log", 1, False)
Fined = "YES"
filesys = FreeFile
Do While readfile.AtEndOfStream <> true
contents = readfile.ReadLine
linumber = readfile.Line
Loop
readfile.Close
If InStr(1, contents, Fined, vbTextCompare) Then
WScript.Echo "Фраза [" & Fined & "] найдена в строке"
Else
WScript.Echo "Фраза [" & Fined & "] не найдена в строке"
End If
Автор: bomzzz
Дата сообщения: 30.09.2009 10:10

Цитата:

InStr([start,] str1, str2[, compare]) Возвращает индекс символа, с которого начинается первое вхождение подстроки str2 в строку str1. Параметр start задаёт номер символа, с которого следует начинать поиск (если не задан, то с начала строки). Поиск производится слева направо. Параметр compare задаёт режим сравнения при обработке строк (0 - двоичное сравнение, 1 - текстовое сравнение).

InStrRev(str1, str2[, start[, compare]]) То же самое, что InStr, но поиск производится справа налево, т.е возвращается номер последнего символа, с которого начинается вхождение подстроки str2 в строку str1.

Left(str, len) Возвращает len символов с начала строки str.

Right(str, len) Возвращает len символов с конца строки str.


ищешь в первый раз - потом второй раз но уже в куске строки начиная с найденного первого места
Автор: Starley25
Дата сообщения: 30.09.2009 10:22
а можно поподробнее не могу сразу врубиться как пользоваться данным мне советом, -). В моей строке нет пробелов, так на всякий случай информирую.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475

Предыдущая тема: Работа в Delphi c CryptoApi


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.