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

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

Автор: mihmig
Дата сообщения: 18.06.2009 17:45
fantomdemon
While True
WScript.Sleep(60000) 'по 60 секунд ждем, может флешку вставят
While gFSO.FileExists("g:\demon.dem")
WScript.Sleep(5000) 'Контролируем флешку с файлом каждые 5 сек
Wend
'Таки вынули флешку...
WScript.Popup("Вы вынули флешку! Вставтье ее обратно или через 5 секунд компьютер взорвется!",60)
Wend

Автор: fantomdemon
Дата сообщения: 18.06.2009 20:22
Ты привязал букву к абсолютному пути (G:\demon.dem), а буква съемного диска меняется в зависимости от количества съемных дисков. Поэтому данный вариант не подходит. Большое спасибо за помошь.
Автор: Rush
Дата сообщения: 19.06.2009 04:43
fantomdemon

Может так?
Код: set objwmi = getobject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
set disks = objwmi.execnotificationquery("select * from __instanceoperationevent " _
& "within 1 where targetinstance isa 'win32_logicaldisk' and targetinstance.drivetype = 2")
set fso = createobject("scripting.filesystemobject")
set wshshell = createobject("wscript.shell")
do while true
set remdisk = disks.nextevent
fileex = remdisk.targetinstance.deviceid & "\" & "demon.dem"
if not fso.fileexists(fileex) then wshshell.run "app.exe"
loop
Автор: fantomdemon
Дата сообщения: 19.06.2009 15:15
for Rush
Спасибо за помощь, но почему-то не работает. Я решил это таким образом, но буду благодарен если ты вычистишь код от всего лишнего. Наверное я наворотил тут кучу ненужного хлама. Заранее благодарен.

On Error Resume Next

Do while f=0
WScript.Sleep 2000

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_LogicalDisk",,48)

For Each objItem in colItems
If objItem.DriveType = "2" And objItem.Description = "Съемный диск" Then
Demon = objItem.Caption & "\demon.dem"
End if
Next

Set fso = CreateObject("Scripting.FileSystemObject")

If fso.FileExists(Demon) Then
MsgBox "Файл существует"
Else
MsgBox "Файл не существует"
End If
Loop
Автор: Rush
Дата сообщения: 19.06.2009 17:33
fantomdemon
Можно и так.
Странно, почему у тебя не работает мой скрипт. У меня нормально работает.
Автор: mihmig
Дата сообщения: 19.06.2009 20:35
Rush

Цитата:
Странно, почему у тебя не работает мой скрипт

Я вообще не сторонник использования WMI-как то не всегда он работает...
fantomdemon

Цитата:
Ты привязал букву к абсолютному пути

если это конкретная флешка, то можно в диспетчере дисков присвоить ей букву Z - и тогда другие флешки не перебьют ее.
Автор: fantomdemon
Дата сообщения: 19.06.2009 21:26
Rush


Как сделать проверку: если данная программа уже запущена , то не запускать ее ?

Добавлено:
mihmig

Присвоить букву можно, но скрипт предназначается выполнять на разных компьютерах.
Автор: Rush
Дата сообщения: 20.06.2009 04:52
fantomdemon

Цитата:
Как сделать проверку: если данная программа уже запущена , то не запускать ее ?

1) wmi

Код: apppath = "маршрут файла"
set fso = createobject("scripting.filesystemobject")
set wshshell = createobject("wscript.shell")
set srv = getobject("winmgmts:\\.\root\cimv2")
set runapp = srv.execquery("select * from win32_process where name = '" _
& fso.getfilename(apppath) & "'")
if runapp.count = 0 then wshshell.run apppath
Автор: mihmig
Дата сообщения: 20.06.2009 08:37

Цитата:
но скрипт предназначается выполнять на разных компьютерах

тогда проверять все диски от A до Z


Цитата:
Как сделать проверку: если данная программа уже запущена

разбирать вывод команды tasklist
Автор: priccolist
Дата сообщения: 24.06.2009 15:14
помогите пожалуйста. Есть программа которая работает с базой MySQL. В программе создается заявка на работу, все данные в MySQL, нужно что бы при создании заявки если поле "А" пустое то оно принимает значение "Б". Иначе говоря: в таблице появляется строка, в ней, если в столбце "А" значение Null, то он принимает значения из другого столбца "Б". Мне посоветовали на VBS написать, но я в этом ничего не смыслю 8(
Автор: V0lt
Дата сообщения: 24.06.2009 21:02
Можно ли на VBScript переименовать все файлы и папки начиная с текущей по след. алгоритму? Берем имя файла/папки находим в нем все строки А1 и заменяем на строки Б1. Затем аналогично А2 на Б2 и так до конца списка, затем собственно переименовываем файл/папку на то что получилось.
Автор: Rush
Дата сообщения: 25.06.2009 14:12
V0lt
Не совсем ясно, что надо. Хотелось бы побольше конкретики.
Откуда список брать? Из файла или как-то по-другому?
Вообщем, сделал пока так, если не то - сделаю иначе:

Код:
' объявляем массивы замен, в данном случае из двух элементов
dim a(1)
dim b(1)
' папка в которой надо менять
dirpath = "***"
' заполняем массивы замен, можно использовать регулярные выражения
' например, таким образом можно добавить 0 впереди цифры.
a(0) = "([1-9]+)"
b(0) = "0$1"
' а так убрать конечные пробелы
a(1) = " +$"
b(1) = ""

set fso = createobject("scripting.filesystemobject")
set rexp = createobject("vbscript.regexp")
subdirs fso.getfolder(dirpath)

sub subdirs(dir)
for each subdir in dir.subfolders
subdirs(subdir)
next
enumfiles(dir)
newname = renfilename(dir.name)
if not fso.fileexists(fso.getparentfoldername(dir) & "\" & newname) _
and newname <> dir.name then dir.name = newname
end sub

sub enumfiles(dir)
for each file in dir.files
newname = renfilename(fso.getbasename(file))
newfilename = newname & "." & fso.getextensionname(file)
if not fso.fileexists(fso.getparentfoldername(file) & "\" & newfilename) _
and newname <> fso.getbasename(file) then file.name = newfilename
next
end sub

function renfilename(filename)
for i = 0 to ubound(a)
rexp.pattern = a(i)
rexp.ignorecase = true
rexp.global = true
filename = rexp.replace(filename, b(i))
next
renfilename = filename
end function
Автор: V0lt
Дата сообщения: 25.06.2009 15:15
Rush

Цитата:
Откуда список брать? Из файла или как-то по-другому?

пойдет как сейчас сделано (внутри скрипта)


Цитата:
Вообщем, сделал пока так, если не то - сделаю иначе

Спасибо! супер!

Еще пожелания:
1. рабочая папка там, где лежит скрипт
(если есть проблемы с пунктом 1, то можно не трогать файлы лежащие непосредственно в рабочей папке)
2. если файл с новым именем уже существует, то удалить файл со старым именем.

...пока хватит с остальном может сам разберусь
Автор: Rush
Дата сообщения: 25.06.2009 15:48
V0lt

Цитата:
Еще пожелания:


Код:
' объявляем массивы замен, в данном случае из двух элементов
dim a(1)
dim b(1)
' заполняем массивы замен, можно использовать регулярные выражения
' например, таким образом можно добавить 0 впереди цифры.
a(0) = "([1-9]+)"
b(0) = "0$1"
' а так убрать конечные пробелы
a(1) = " +$"
b(1) = ""

set fso = createobject("scripting.filesystemobject")
set rexp = createobject("vbscript.regexp")
dirpath = fso.getparentfoldername(wscript.scriptfullname)
subdirs fso.getfolder(dirpath)

sub subdirs(dir)
for each subdir in dir.subfolders
subdirs(subdir)
next
enumfiles(dir)
newname = renfilename(dir.name)
if not fso.folderexists(fso.getparentfoldername(dir) & "\" & newname) _
and newname <> dir.name then dir.name = newname
end sub

sub enumfiles(dir)
for each file in dir.files
newname = renfilename(fso.getbasename(file))
newfilename = newname & "." & fso.getextensionname(file)
if fso.fileexists(fso.getparentfoldername(file) & "\" & newfilename) then
fso.deletefile file, true
elseif newname <> fso.getbasename(file) and file <> wscript.scriptfullname then
file.name = newfilename
end if
next
end sub

function renfilename(filename)
for i = 0 to ubound(a)
rexp.pattern = a(i)
rexp.ignorecase = true
rexp.global = true
filename = rexp.replace(filename, b(i))
next
renfilename = filename
end function
Автор: V0lt
Дата сообщения: 25.06.2009 16:24
Rush

Цитата:
В работе не проверял. Но, думаю, работать будет нормально...

скрип что-то не так делает, хорошо хоть экспериментировал на копии, по-позже разберусь...
Автор: Rush
Дата сообщения: 25.06.2009 16:42
V0lt

Цитата:
скрип что-то не так делает, хорошо хоть экспериментировал на копии, по-позже разберусь...

Еще бы экперименты проводить на рабочей папке...
Сейчас проверил - вроде, никаких проблем не заметил. Все делает скрипт по твоим пожеланиям...
Может ты имел что-то другое в виду?

Добавлено:
а понял. Попробуй так:

Код:
' объявляем массивы замен, в данном случае из двух элементов
dim a(1)
dim b(1)
' заполняем массивы замен, можно использовать регулярные выражения
' например, таким образом можно добавить 0 впереди цифры.
a(0) = "([1-9]+)"
b(0) = "0$1"
' а так убрать конечные пробелы
a(1) = " +$"
b(1) = ""

set fso = createobject("scripting.filesystemobject")
set rexp = createobject("vbscript.regexp")
dirpath = fso.getparentfoldername(wscript.scriptfullname)
subdirs fso.getfolder(dirpath)

sub subdirs(dir)
for each subdir in dir.subfolders
subdirs(subdir)
next
enumfiles(dir)
newname = renfilename(dir.name)
if not fso.fileexists(fso.getparentfoldername(dir) & "\" & newname) _
and newname <> dir.name then dir.name = newname
end sub

sub enumfiles(dir)
for each file in dir.files
newname = renfilename(fso.getbasename(file))
newfilename = newname & "." & fso.getextensionname(file)
if newname <> fso.getbasename(file) then
if fso.fileexists(fso.getparentfoldername(file) & "\" & newfilename) then
fso.deletefile file
elseif file <> wscript.scriptfullname then
file.name = newfilename
end if
end if
next
end sub

function renfilename(filename)
for i = 0 to ubound(a)
rexp.pattern = a(i)
rexp.ignorecase = true
rexp.global = true
filename = rexp.replace(filename, b(i))
next
renfilename = filename
end function
Автор: Postscriptum
Дата сообщения: 02.07.2009 07:52
Клиенты запускают приложение с сервера, используя стандартый терминал Windows(mstsc.exe). Иногда терминальные сессии некорректно закрываюся, компы виснут и т.д. и т.п. Как на VBScript узнать, повисло это приложение или нет? Для того, чтоб узнать, сколько юзеров и кто работают с этим приложениям использую такой код:

Код: strComp="."
strnamespace="Root\CIMV2"
set objService=GetObject("WinMgmts:\\" & strComp & "\" & strNamespace)
set colprocess=objService.ExecQuery _
("select * from win32_Process where Name='program.exe'")
kol=0
for each objProcess in colProcess
intRes=objProcess.GetOwner(strUserName,strUserDomain)
if IntRes=0 then
Response=MsgBox("Владельцем процесса " & objProcess.Name & " является " & strUserDomain & "\" & strUserName,0,"Информация")
kol=kol+1
else
Response=MsgBox("Ошибка при определении владельца процесса " & objProcess.Name,0,"Ошибка")
end if
next
Автор: niichavo
Дата сообщения: 02.07.2009 09:27
Postscriptum

Цитата:
И есть где информация по полям, которые существуют у объекта objProcess?

Для просмотра св-ств объектов, поиск нужных классов и т.п. есть для WMI такая штука как WMI Tools
Автор: Postscriptum
Дата сообщения: 03.07.2009 01:08
niichavo
Сенкс. Попробую.
У меня в Delphi, оказывается, есть замечательный Help, в котором все есть.
Только вот в win32_Process такого свойства нет, я пробовал всяческие win32_Terminal, Win32_ServerSession,Win32_SessionProcess и т.д. и нигде не могу найти нужное мне свойство. У win32_Process есть свойство SessionId - вот где теперь по этому SessionId посмотреть - активен этот сеанс или нет?
Автор: DrWarrior
Дата сообщения: 03.07.2009 06:58
Доброе время суток!

Подскажите, как с помощью WSH прочитать нужную запись в DBF-файле? пробовал так:
Set File = fso.GetFile(aDBPath&"1SDBSet.dbf")
Set TS = File.OpenAsTextStream(1)
Line2 = TS.ReadLine ' а также Read и ReadALL
MsgBox(Line2)

но в итоге отображается несоклько символов "m" и все. Хотя длина строки Line2 соответствует длине файла 1SDBSET.DBF. Такое впечатление, что читываение идет до определенного символа(например перенос каретки) и все...
Автор: Rush
Дата сообщения: 03.07.2009 08:26
DrWarrior
Используя FSO можно считывать только текстовые файлы (вернее те, где отсутствуют нулевые символы ascii). На 0 чтение прерывается.
Можно использовать adodb.

Код:
set stream = createobject("adodb.stream")
stream.type = 1
stream.open
stream.loadfromfile("aDBPath&1SDBSet.dbf")
line2 = stream.read()
stream.close
Автор: DrWarrior
Дата сообщения: 03.07.2009 09:11

Цитата:
Rush
, спасибо!

попробуем через ADO.....
Автор: V0lt
Дата сообщения: 03.07.2009 10:25
посоветуйте хороший редактор+отладчик для VBScript
Автор: Integer27h
Дата сообщения: 03.07.2009 10:57
V0lt

Цитата:
посоветуйте хороший редактор+отладчик для VBScript

PrimalScript
Автор: V0lt
Дата сообщения: 03.07.2009 11:43
Integer27h

Цитата:
PrimalScript

с отладкой там беда какая-то
Автор: mihmig
Дата сообщения: 03.07.2009 18:51

Цитата:
посоветуйте хороший редактор+отладчик для VBScript

vbsedit
Автор: V0lt
Дата сообщения: 04.07.2009 14:13
mihmig

Цитата:
vbsedit

спасибо, то что надо
Автор: V0lt
Дата сообщения: 05.07.2009 21:49
Можно ли сделать так, чтобы скрипт запускался через cscript.exe, а не wscript.exe? Т.е. надо чтобы юзер шелкнул по скрипту и увидел консоль в котором скрип рисует ход выполнения.
Автор: Grisha_Tamashi_SAN
Дата сообщения: 06.07.2009 11:04
Хай, Олл.
Сделал скриптик для автозагрузки цепочки комманд или программ в hidden режиме.
---hid_exec.vbs

Код:
Option Explicit
On Error Resume Next

Dim WshShell
Set WshShell = WScript.CreateObject ("WScript.Shell")

'Число в скобках равно "количество дисков минус единица"
Dim TrueCryptCommands(2), TrueCryptCommand

TrueCryptCommands(0) = Chr(34) & "C:\Program Files\TrueCrypt\TrueCrypt.exe" & Chr(34) & " /v \Device\Harddisk1\Partition1 /lS /q background" 'Монтируем том
TrueCryptCommands(1) = "net share Music$=s:\music /remark:" & """My Misic""" 'Создаем шары
TrueCryptCommands(2) = "net share dist$=s:\dist /remark:" & """My distribution""" 'Создаем шары
TrueCryptCommands(3) = WshShell.ExpandEnvironMentStrings("%SystemDrive%") & "\del_temp.bat" 'Удаляем временные файлы

For Each TrueCryptCommand in TrueCryptCommands
MSGbOX TrueCryptCommand
WshShell.Run TrueCryptCommand, 0, vbTrue
Next
Автор: mozers
Дата сообщения: 06.07.2009 15:14
V0lt
Есть несколько вариантов:
Запускать скрипт из батника со сдедующим содержанием:
Код: @cscript /nologo c:\path\my_script.vbs

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475

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


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