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

» Программирование "удобняшек" на VBScript (Часть 2)

Автор: atomheart
Дата сообщения: 27.12.2011 14:57
megamozg13
Спасибо за помощь, но всё равно не вылючает соединение. Ну да ладно, я нашёл более простое решение: с помощью net start/stop - вкл/выкл DHCP клиент. Так даже удобнее - не надо отключать адаптер.
Автор: chel78
Дата сообщения: 08.01.2012 16:32
привет всем,
возможно ли как то реализовать кликалку, определенного диапазона, скажем так необходимо кликнуть левой мышью каждый пиксел в определенном диапазоне.
есть пример,, это кусочек кода.
если прописать для каждого, то получится многокилометровый скрипт.

Код: Set oAutoIt = WScript.CreateObject("AutoItX3.Control")
oAutoIt.MouseMove 300, 400, 0
oAutoIt.MouseDown "left"
oAutoIt.MouseUp "left"
oAutoIt.MouseMove 300, 401, 0
oAutoIt.MouseDown "left"
oAutoIt.MouseUp "left"
oAutoIt.MouseMove 300, 402, 0
oAutoIt.MouseDown "left"
oAutoIt.MouseUp "left"
oAutoIt.MouseMove 300, 403, 0
oAutoIt.MouseDown "left"
oAutoIt.MouseUp "left"
...
oAutoIt.MouseMove 301, 400, 0
oAutoIt.MouseDown "left"
oAutoIt.MouseUp "left"
oAutoIt.MouseMove 301, 401, 0
oAutoIt.MouseDown "left"
oAutoIt.MouseUp "left"
oAutoIt.MouseMove 301, 402, 0
oAutoIt.MouseDown "left"
oAutoIt.MouseUp "left"
oAutoIt.MouseMove 301, 403, 0
oAutoIt.MouseDown "left"
oAutoIt.MouseUp "left"
...
Автор: AndVGri
Дата сообщения: 09.01.2012 03:01
chel78
А что For не работает?

Код:
For x = 300 To 400
For y = 400 To 500
'повтор
oAutoIt.MouseMove x, y, 0
'....
Next
Next
Автор: chel78
Дата сообщения: 09.01.2012 11:48

Цитата:
А что For не работает?

спасибо, попробую..
p.s. сорри, просто я нуб в этом..
Автор: ComradG
Дата сообщения: 12.01.2012 19:07
давно не был в этой ветке, а здесь между тем бурное обсуждение...
AndVGri
Цитата:
Через WMI, хоть ComradG его и не любит.
попросил бы инсинуации держать при себе.
megamozg13нафига там вообще impersonationLevel? что к чему? расписывать от и до влом, поэтому лови пример:
Код: Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_NetworkAdapter " _
& "Where NetConnectionID = 'Local Area Connection 2'")

For Each objItem in colItems
strMACAddress = objItem.MACAddress
Next
Автор: ComradG
Дата сообщения: 14.01.2012 12:39
Nekt

Код: Const adVarChar = 200
Const MaxCharacters = 255

Set DataList = CreateObject("ADOR.Recordset")
DataList.Fields.Append "FileName", adVarChar, MaxCharacters
DataList.Fields.Append "FileDate", adVarChar, MaxCharacters
DataList.Open

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\My Folder")

Set colFiles = objFolder.Files

For Each objFile in colFiles
DataList.AddNew
DataList("FileName") = objFile.Path
DataList("FileDate") = objFile.DateCreated
DataList.Update
Next

DataList.Sort = "FileDate"

DataList.MoveFirst
i = 1

Do Until DataList.EOF
If i < 10 Then
x = CStr("000" & i)
ElseIf i < 100 Then
x = CStr("00" & i)
ElseIf i < 1000 Then
x = CStr("0" & i)
Else
x = i
End If

strNewName = "C:\My Folder\file_2012_" & x & ".jpg"
objFSO.MoveFile DataList.Fields.Item("FileName"), strNewName

i = i + 1
DataList.MoveNext
Loop
Автор: AKBA
Дата сообщения: 14.01.2012 14:59
Мне требуется решить вот такую проблему:
1 - имеется документ MS Word
2 - он состоит из двух страниц
3 - на первой странице документа в четырех местах имеется шифр вида хххххх
4 - этот шифр необходимо менять в арифметической последовательности хххххх+1, а остальной текст оставлять без изменений
Что можно сделать такое, чтобы я например, забивал первый и последний номер шифра, нажимал печать и документ автоматически бы распечатывался на одном листе с двух сторон в необходимом количестве экземпляров?

Evgeny972
Написать нужную приблуду на VBA, сохраняемую в том же документе, и прикрутить кнопку

Евгений, в том то и дело, что я на текущий момент времени очень слабо представляю что это такое и с чем едят, поэтому мне бы очень хотелось получить более конкретную помощь.
Я готов самостоятельно почитать, просто скажите в каком направлении мне действовать.
Автор: ComradG
Дата сообщения: 15.01.2012 14:37
AKBA
можно вполне обойтись и без VBA.
Код: Const wdReplaceAll = 2

Set objWord = CreateObject("Word.Application")
objWord.Visible = True 'если True - окно видимо, False - идет лесом

Set objDoc = objWord.Documents.Open("C:\MyFolder\MyDoc.doc")
Set objSelection = objWord.Selection

objSelection.Find.Text = "xxxxxx"
objSelection.Find.Forward = TRUE
objSelection.Find.MatchWholeWord = TRUE

objSelection.Find.Replacement.Text = "xxxxxy"
objSelection.Find.Execute ,,,,,,,,,,wdReplaceAll
Автор: Gulkov
Дата сообщения: 19.01.2012 14:34
У меня задача: нужно сделать подключение принтера в терминальной сессии. Но нужно подключать определенный принтер в зависимости от того с какого компа зашел пользователь. Т.е. в AD каждому принтеру соответствует группа, членами которой являются близлежайшие компьютеры. Таким образом, мигрирующий по разным компам пользователь всегда имеет возможность печати с терминального сервера на ближний принтер. Создал скрипт. Работает прекрасно, но только на 2003 сервере. На 2008 сервере метод IsMember почему-то всегда true. Подскажите кто знает, что не так в 2008?

Код:
Set objShell = WScript.CreateObject("WScript.Shell")

If IsThisCompAMamberOfGroup("prn_hp1102wA1-1") Then
strResult = mapPrinter("\\192.168.0.3\HP1102w","",True)
End If

Function IsThisCompAMamberOfGroup(strGroup)
On Error Resume Next
IsThisCompAMamberOfGroup = False
Set objNetwork = WScript.CreateObject("WScript.Network")
strDomain = objNetwork.UserDomain
set WshShell = WScript.CreateObject("WScript.Shell")
stromp = WshShell.ExpandEnvironmentStrings("%ClientName%")
Set objUser=GetObject("WinNT://" & strDomain & "/" & stromp & ",computer")
Set objGrp=GetObject("WinNT://" & strDomain & "/" & strGroup & ",group")
If objGrp.IsMember(objUser.ADsPath & "$") Then
    IsThisCompAMamberOfGroup=True
End If
End Function

Function mapPrinter(strNetShare,strPort,blnDefault)
on error resume next
Set objNetwork = CreateObject("WScript.Network")
If strPort<>"" Then
objNetwork.AddWindowsPrinterConnection strPort, strNetShare
Else
objNetwork.AddWindowsPrinterConnection strNetShare
End If
If Err.Number<>0 Then mapPrinter = Err.Description
If Err.Number=0 And blnDefault Then objNetwork.SetDefaultPrinter strNetShare
If Err.Number<>0 Then mapPrinter = mapPrinter & vbCRLF & Err.Description
End Function
Автор: 3aki
Дата сообщения: 19.01.2012 17:06
Помогите пожалуйста сделать тоже но на VBScript


Код:
start /w rasphone.exe -f "rasphone.pbk" -d "1c-vpn"
ping -w 1 -n 2 10.10.10.4 >nul
if %ERRORLEVEL% == 0 ( start /w 1c.rdp
rasdial /D )
Автор: Black_Lung
Дата сообщения: 20.01.2012 12:44
3aki


Код:
Set shl = WScript.CreateObject("WScript.Shell")
shl.Run "rasphone.exe -f "&chr(34)&"rasphone.pbk"&chr(34)&" -d "&chr(34)&"1c-vpn"&chr(34), 1, true
if shl.Run("ping -w 1 -n 2 10.10.10.4", 0, true) = 0 then shl.Run "1c.rdp rasdial /D",1,true
Автор: 3aki
Дата сообщения: 20.01.2012 14:54
Black_Lung
Спасибо большое, суть уловил подправил, работает
Автор: Scaramanga
Дата сообщения: 23.01.2012 18:45
Привет всем. Задача следующая. Необходимо получить OU и Фамилию Имя текущего пользователя, из AD и добавить полученноe в переменные %OU% %FirstName% %LastName%. Помогите реализовать пожалуйста. Заранее спасибо
Автор: ComradG
Дата сообщения: 24.01.2012 10:22
Scaramanga
что за OU? что за переменные в %%? и как именно из AD нужно тащить данные? может все же как-то поподробнее расскажите о поставленной задаче, а то понять из урывочного сообщения ничего нельзя.
Автор: Black_Lung
Дата сообщения: 24.01.2012 10:25
Scaramanga
Пользователь берется текущий залогиненый на компе, а комп задается параметром

Код: strComputer = Wscript.arguments.Item(0)
Set Shell = CreateObject("WScript.Shell")
Sdir=Shell.CurrentDirectory
Set FSO = CreateObject("Scripting.FileSystemObject")
Set DDD = FSO.CreateTextFile(Sdir+"\ddd.bat", True)

Const ADS_SCOPE_SUBTREE = 10
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 10
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colComputer = objWMIService.ExecQuery _
("Select * from Win32_ComputerSystem")
For Each objComputer in colComputer
login=objComputer.UserName
next
if IsNull(login)=True then
    OU="None logged in"
    FirstName="None logged in"
    LastName="None logged in"
    else
    user=split(login,"\")
    objCommand.CommandText="SELECT cn,distinguishedName FROM 'LDAP://DC=domen,DC=com' WHERE objectcategory='User' and samAccountName='"&user(1)&"'"
    Set objRecordSet = objCommand.Execute
    if objRecordSet.EOF=0 and objRecordSet.BOF=0 then
        dname=Split(objRecordSet.Fields(0).Value, ",")
        for x=0 to ubound(dname)
            if left(dname(x),3)="OU=" then OU=OU&right(dname(x),len(dname(x))-3)&"\"
            next
        Name=split(objRecordSet.Fields(1).Value, " ")
        FirstName=name(1)
        LastName=name(2)
end if
    end if
    

Set objWMIService = nothing

DDD.writeline("SET OU="&chr(34)&OU&chr(34))
DDD.writeline("SET FirstName="&chr(34)&FirstName&chr(34))
DDD.writeline("SET LastName="&chr(34)&LastName&chr(34))
DDD.Close

shell.run "ddd.bat",1,true

Set FSO = nothing
Set DDD = nothing
Автор: king_stiven
Дата сообщения: 02.02.2012 17:05
Надо передать запущенному батнику со свёрнутым или невидимым окном нажатие клавиши без его разворачивания или выхода из сумрока. Имя , PID ну и любую инфу из tasklist можно выдрать. То есть при запуске скрипта передавалось нажатие заранее прописанной клавиши в определённое окно, можно любыми средствами. Есть решения?
Автор: ComradG
Дата сообщения: 03.02.2012 08:20
king_stiven
через vbs - нет. по крайней мере если речь идет о чистом синтаксисе, а не предустановленных библиотеках вроде dynwrap.dll. пробовал средствами vbs переключаться на окно и использовать SendKeys, но это лишь подтвердило мою теорию, так как контрол (в данном случае речь именно о них), на котором по дефолту устанавливается фокус не обязательно может быть элемент управления button, это может быть и textbox и combobox, - да все что угодно. однако данная задача вполне решаема с помощью другой технологии - PowerShell, в которой реализована поддержка WinAPI (не напрямую, конечно, а спредварительным созданием нужной библиотеки или типа (командлет Add-Type)).
кстати, контрол клавиши был получен с помощью Spy++?
Автор: Evgeny972
Дата сообщения: 03.02.2012 08:26
ComradG
Цитата:
задача вполне решаема с помощью другой технологии - PowerShell
Или AutoIt
Автор: ComradG
Дата сообщения: 03.02.2012 08:42
Evgeny972

Цитата:
Или AutoIt
гы! или на Python - выбор просто огромен.
Автор: king_stiven
Дата сообщения: 03.02.2012 09:27
ComradG
Evgeny972
Понял, есть некоторое решение, только куда это ткнуть не знаю. Есть проект на дельфи
http://content.mail.ru/arch/23707/1420468.html
или такое
http://borland.xportal.ru/forum/viewtopic.php?t=18159&start=0&postdays=0&postorder=asc&highlight=&sid=d257c239f7c5efa01f0015db07c8d251

щас пойду в програмирование, там меня может пнут, куда надо.
Автор: ComradG
Дата сообщения: 03.02.2012 09:33
king_stiven
рад бы помочь, но с делфи не знаком.
Автор: king_stiven
Дата сообщения: 03.02.2012 10:20
ComradG
а вот это что не знаешь, какой язык?
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool __stdcall EnumProc(HWND _HWND)
{
if(_HWND)
{
HGLOBAL _HGLOBAL = GlobalAlloc(GMEM_SHARE, sizeof(unsigned long));

DWORD * _PID = (unsigned long *) GlobalLock(_HGLOBAL);
DWORD _RESULT = GetWindowThreadProcessId(_HWND, _PID);

if(_RESULT)
{
char _CLASS [ 95];

GetClassName (_HWND, _CLASS, 95);

AnsiString Class = _CLASS;

if(Class == "TMainForm")
{
SendMessage(_HWND, WM_KEYDOWN, VK_F1, 1);
}
}
}

return true;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
EnumWindows((WNDENUMPROC)EnumProc, 0);
}
//--------------------------------------------------------------------------
Автор: gap5
Дата сообщения: 03.02.2012 10:41
Подскажите, как лучше реализовать watchdog для решения такой задачи: клиентская софтина видеонаблюдения иногда (1-2 раза в неделю) теряет связь с сервером и требуется ее перезапуск.

Когда она работает в штатном режиме, то загрузка проца как минимум 10-15%.
Т.е. в цикле проверяем запущен ли нужный ехе файл, если да то смотрим загрузку процессора, если она меньше 10%, то выполняем команду перезапуска (или лучше лог-аута юзера). Ну и попутно можно еще лог небольшой вести с датой\временем перезапуска.

Основной вопрос в отслеживании загрузки проца. Притом желательно замерять загрузку именно конкретным процессом.
Автор: yse
Дата сообщения: 03.02.2012 16:55
вопрос как запустить системный значок из библиотеки или
Как извлечь иконки из библиотеки shell32.dll

и при этом запустить ,нужен пример на vbs
Автор: ComradG
Дата сообщения: 04.02.2012 14:53
king_stiven
к чему, собственно, нужно было постить сей сишный код?

gap5
а мониторинг подразумевается с правами админа?

yse
запустить что? и вообще вопрос о чем? создать ярлык программы с установленным для него значком из shell32.dll? пишите, пожалуйста, разборчиво, а не так, чтобы разбираться с бутылкой.
Автор: gap5
Дата сообщения: 06.02.2012 18:42
ComradG
желательно нет
и софтина запущена от имени обычного юзера

у НЕадмина могут быть проблемы?
Автор: ComradG
Дата сообщения: 06.02.2012 19:05
gap5

Цитата:
у НЕадмина могут быть проблемы?
нет, если не оперировать в скрипте объектами Win32, поэтому я и уточняю условия мониторинга загруженности процессора. не обещаю, но постараюсь что-нибудь сообразить.
Автор: Engraf
Дата сообщения: 10.02.2012 12:16
В представленном ниже коде при попытке переименовать файл (mFiles.Name=str), если файл с таким именем уже существует, скрипт "вылетает" из цикла (как при Exit For). Почему так?

Код: ...
On Error Resume Next
...
For Each mFiles In mailF.Files
If Right(mFiles.Name,4)=".msg" Then
i=CInt(Left(Right(mFiles.Name,14),10))
If i < CInt(oldCount) Then
i=i+CInt(oldCount)
str="pd5" & String(10-Len(CStr(i)),"0") & i & ".msg"
Err.Clear
mFiles.Name=str
If Err.Number<>0 Then
logFile.WriteLine(String(9," ") & "#Can not rename " & mFiles.Name & " to " & str)
End If
End If
End If
Next
...
Автор: ComradG
Дата сообщения: 10.02.2012 15:19
Engraf
на самом деле это даже не переименование, а попытка присвоить объекту файловой системы некоторое значение; вот вам, будучи мужчиной, не было бы неприятно, если бы вас обозвали Наташей? здесь то же самое. чтобы корректно переименовать файл должно использовать метод MoveFile (по крайней мере если используется FileSystemObject):
Код: Set objFSO = CreateObject("Scripting.FileSystemObject")
...
objFSo.MoveFile "C:\test.txt" "C:\rest.txt"
Автор: niko7
Дата сообщения: 13.02.2012 08:00
Помогите со скриптом, нашел его в интернете. Закрывает зависший outlook.
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'Outlook.exe'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
Что означает "\root\cimv2"?

Страницы: 12345678910111213141516171819202122232425

Предыдущая тема: Помогите новичку в C++


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