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

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

Автор: kolyas
Дата сообщения: 17.09.2009 17:31
Rush
преогромнейшее спасибище.. недочитал описание
"Определяет ни одного или один символ, стоящий перед ним. Эквивалентно {0,1}. Если этот метасимвол идёт непосредственно за конструкциями (*, +, ?, {n}, {n,}, {n,m}), это приводит к некоторому изменению алгоритма поиска по заданному шаблону"
вот еще бы понять к какому такому - некоторому
Автор: mozers
Дата сообщения: 17.09.2009 19:39
kolyas
Цитата:
еще бы понять к какому такому - некоторому

VBScript: Регулярные выражения
CHM-Help [46КБ]
Великолепный перевод соответствующих глав из MSDN выполнил Александр Асябрик aka Shura.

Лучше чем там написано я вряд ли объясню...
Автор: Gavigor
Дата сообщения: 18.09.2009 08:18
Ребята, помогите пожалуйста!
Есть скрипт (ищет файл):


Код:
Option Explicit


Dim objFSO
Dim objDrive
Dim strFileNameForFind
Dim i
ReDim arrPaths(0) ' Динамический массив для найденных путей


strFileNameForFind = "111.txt" ' Имя файла для поиска.

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
arrPaths(LBound(arrPaths)) = False ' Первый элемент массива - флаг результата поиска.

For Each objDrive In objFSO.Drives ' Перебираем все существующие тома.
If objDrive.DriveType = 2 Then ' Том фиксированный?
If objDrive.IsReady Then ' Том готов?
'WScript.Echo "Find on drive " & objDrive.DriveLetter & ":..."

FindInSubFolders objDrive.RootFolder, strFileNameForFind ' Вызываем процедуру поиска
' для корневой папки этого тома.
' Обработка вложенных папок будет
' вестись рекурсивно.
End If
End If
next


Sub FindInSubFolders(objFolder, strFileName)
Dim objSubFolder
Dim strFullFileName

'WScript.Echo objFolder.Path ' Выводим путь обрабатываемой папки (для
' отладки; имеет смысл закомментировать).

strFullFileName = objFSO.BuildPath(objFolder, strFileName) ' Строим полный путь файла.

If objFSO.FileExists(strFullFileName) Then ' Файл существует?
ReDim Preserve arrPaths(Ubound(arrPaths) + 1) ' Увеличиваем размер массива.
arrPaths(LBound(arrPaths)) = True ' Устанавливаем флаг результата поиска.
arrPaths(UBound(arrPaths)) = strFullFileName ' Запоминаем путь.

WScript.Echo "Found file [" & strFileName & "] in folder [" & objFolder.Path & "]."
End If

On Error Resume Next ' Обрабатываем ошибки, возможные в случае,
' когда нет доступа к содержимому папки
' (пример - «System Volume Information».
For Each objSubFolder In objFolder.SubFolders
If Err.Number = 0 Then ' Удалось получить доступ к содержимому папки?
FindInSubFolders objSubFolder, strFileName ' Вызываем процедуру поиска для каждой из подпапок.
Else ' Если не удалось —
Err.Clear ' сбрасываем состояние ошибки и движемся дальше.
'WScript.Echo "Can't enumerate subfolders for folder [" & objFolder.Path & "]."
End If
Next
On Error Goto 0 ' Восстанавливаем стандартную обработку ошибок
End Sub
Автор: bomzzz
Дата сообщения: 18.09.2009 08:34
гавигорка! приветик!
у тебя скрипт уже километровый.
вот так копировать
Set myFile = fso.GetFile(FolderPath & "\" & MyFile)
myFile.Copy "MyFile", True
а чтоб имя менялось - наверно нужно сделать проверку на существование файла и если он существует то переименовать
Автор: Gavigor
Дата сообщения: 18.09.2009 08:44
bomzzz

привет!
щас попробую...


Добавлено:

Код:
Option Explicit


Dim objFSO
Dim objDrive
Dim strFileNameForFind
Dim i
ReDim arrPaths(0) ' Динамический массив для найденных путей


strFileNameForFind = "111.txt" ' Имя файла для поиска.

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
arrPaths(LBound(arrPaths)) = False ' Первый элемент массива - флаг результата поиска.

For Each objDrive In objFSO.Drives ' Перебираем все существующие тома.
If objDrive.DriveType = 2 Then ' Том фиксированный?
If objDrive.IsReady Then ' Том готов?
'WScript.Echo "Find on drive " & objDrive.DriveLetter & ":..."

FindInSubFolders objDrive.RootFolder, strFileNameForFind ' Вызываем процедуру поиска
' для корневой папки этого тома.
' Обработка вложенных папок будет
' вестись рекурсивно.
End If
End If
next


Sub FindInSubFolders(objFolder, strFileName)
Dim objSubFolder
Dim strFullFileName

'WScript.Echo objFolder.Path ' Выводим путь обрабатываемой папки (для
' отладки; имеет смысл закомментировать).

strFullFileName = objFSO.BuildPath(objFolder, strFileName) ' Строим полный путь файла.

If objFSO.FileExists(strFullFileName) Then ' Файл существует?
ReDim Preserve arrPaths(Ubound(arrPaths) + 1) ' Увеличиваем размер массива.
arrPaths(LBound(arrPaths)) = True ' Устанавливаем флаг результата поиска.
arrPaths(UBound(arrPaths)) = strFullFileName ' Запоминаем путь.


' ============================================================


вставлять сюда? пробывал - не работает....мож не туда...




' ============================================================


WScript.Echo "Found file [" & strFileName & "] in folder [" & objFolder.Path & "]."
End If

On Error Resume Next ' Обрабатываем ошибки, возможные в случае,
' когда нет доступа к содержимому папки
' (пример - «System Volume Information».
For Each objSubFolder In objFolder.SubFolders
If Err.Number = 0 Then ' Удалось получить доступ к содержимому папки?
FindInSubFolders objSubFolder, strFileName ' Вызываем процедуру поиска для каждой из подпапок.
Else ' Если не удалось —
Err.Clear ' сбрасываем состояние ошибки и движемся дальше.
'WScript.Echo "Can't enumerate subfolders for folder [" & objFolder.Path & "]."
End If
Next
On Error Goto 0 ' Восстанавливаем стандартную обработку ошибок
End Sub
Автор: bomzzz
Дата сообщения: 18.09.2009 09:04
у тебя уже так много понаписано. подпрограммы нужны и процедры.

IF УСЛОВИЕ THEN
ЕСЛИ УСЛОВИЕ ИСТИННО ВЫПОЛНЯЮТСЯ ЭТИ ОПЕРАТОРЫ
ELSE
ЕСЛИ УСЛОВИЕ ЛОЖНО ВЫПОЛНЯЮТСЯ ЭТИ ОПЕРАТОРЫ
END IF - КОНЕЦ БЛОКА IF

блок ELSE можно опустить
Автор: Gavigor
Дата сообщения: 18.09.2009 09:11
а нельзя так:

copy strFileNameForFind в место со скриптом?

........
Автор: bomzzz
Дата сообщения: 18.09.2009 09:14
хм.

Set myFile = fso.GetFile(strFullFileName)
myFile.Copy WScript.Path & "MyFile", True
Автор: Gavigor
Дата сообщения: 18.09.2009 09:32
ошибка: "файл не найден" - путь не правильно прописан?...
Автор: kolyas
Дата сообщения: 18.09.2009 13:06
mozers

Цитата:

VBScript: Регулярные выражения
CHM-Help [46КБ]


это весЧь ..
все в одном месте ..почему то яндекс даже не посоветовал обратиться к microsoft ..


Автор: bomzzz
Дата сообщения: 18.09.2009 15:07
а кто посоветовал обращаться к яндексу?
http://narod.ru/disk/12530906000/Automation.chm.html - это не хуже, объемнее, но в "регулярных выражениях" есть об общих принципах.

я вот эту строку увидел strFullFileName = objFSO.BuildPath(objFolder, strFileName)
плэтому так написал.

Цитата:

Set FSO = CreateObject("Scripting.FileSystemObject")
Path = FSO.BuildPath("C:\Program Files", "New Folder")
MsgBox Path
Path = FSO.BuildPath("C:\Program Files\", "New Folder")
MsgBox Path
Добавляет к заданному пути новое имя. Если необходимо, вставляется "\".


просматрел весь скрипт бегло- не вижу где переменной objFolder присваевается значение
Автор: Gavigor
Дата сообщения: 21.09.2009 00:52
Вот готовый скрипт (респект alexii с http://forum.script-coding.info/profile.php?id=1844):
Замечание: найденные файлы будут копироваться не в папку скрипта, а во вновь создаваемую папку со случайным именем. Это сделано специально для упрощения и ускорения работы.


Код:

Option Explicit

Dim objFSO
Dim objDrive
Dim strFileName4Find
Dim strPath4Copy
Dim i
ReDim arrPaths(0) ' Динамический массив для найденных путей


strFileName4Find = "test.txt" ' Имя файла для поиска.

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

arrPaths(LBound(arrPaths)) = False ' Первый элемент массива - флаг результата поиска.

For Each objDrive In objFSO.Drives ' Перебираем все существующие тома.
If objDrive.DriveType = 2 Then ' Том фиксированный?
If objDrive.IsReady Then ' Том готов?
WScript.Echo "Find on drive " & objDrive.DriveLetter & ":..."

FindInSubFolders objDrive.RootFolder, strFileName4Find ' Вызываем процедуру поиска
' для корневой папки этого тома.
' Обработка вложенных папок будет
' вестись рекурсивно.
End If
End If
Next

If arrPaths(LBound(arrPaths)) Then ' Файл(ы) был(и) найден(ы)?
strPath4Copy = GetRandomSubFolderName( _
objFSO.GetFile(WScript.ScriptFullName).ParentFolder) ' Получаем случайное имя папки для копирования.
objFSO.CreateFolder strPath4Copy ' Создаём эту папку.

WScript.Echo
WScript.Echo "Found paths for file [" & strFileName4Find & "]:"
WScript.Echo "------------------------------------------------------------"

For i = LBound(arrPaths) + 1 To UBound(arrPaths) ' Выводим все найденные пути.
WScript.Echo arrPaths(i)

With objFSO
.CopyFile arrPaths(i), .BuildPath(strPath4Copy, _
.GetBaseName(arrPaths(i)) & " (" & CStr(i) & ")." & _
.GetExtensionName(arrPaths(i))) ' Копируем найденные файлы в созданную папку
' под именем «<старое имя> (<номер>).<расширение>»
End With
Next

WScript.Echo "------------------------------------------------------------"
WScript.Echo
WScript.Echo "Files was copyed to folder [" & strPath4Copy & "]."
Else
WScript.Echo "Not found paths for file [" & strFileName4Find & "]."
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub FindInSubFolders(objFolder, strFileName)
Dim objSubFolder
Dim strFullFileName

WScript.Echo objFolder.Path ' Выводим путь обрабатываемой папки (для
' отладки; имеет смысл закомментировать).

strFullFileName = objFSO.BuildPath(objFolder, strFileName) ' Строим полный путь файла.

If objFSO.FileExists(strFullFileName) Then ' Файл существует?
ReDim Preserve arrPaths(Ubound(arrPaths) + 1) ' Увеличиваем размер массива.
arrPaths(LBound(arrPaths)) = True ' Устанавливаем флаг результата поиска.
arrPaths(UBound(arrPaths)) = strFullFileName ' Запоминаем путь.

WScript.Echo "Found file [" & strFileName & "] in folder [" & objFolder.Path & "]."
End If

On Error Resume Next ' Обрабатываем ошибки, возможные в случае,
' когда нет доступа к содержимому папки
' (пример - «System Volume Information».
For Each objSubFolder In objFolder.SubFolders
If Err.Number = 0 Then ' Удалось получить доступ к содержимому папки?
FindInSubFolders objSubFolder, strFileName ' Вызываем процедуру поиска для каждой из подпапок.
Else ' Если не удалось —
Err.Clear ' сбрасываем состояние ошибки и движемся дальше.
WScript.Echo "Can't enumerate subfolders for folder [" & objFolder.Path & "]."
End If
Next
On Error Goto 0 ' Восстанавливаем стандартную обработку ошибок
End Sub
'=============================================================================

'=============================================================================
' Based on: VBScript: генерация пути для временного файла
' (http://forum.script-coding.info/viewtopic.php?pid=9523#p9523)
'
Function GetRandomSubFolderName(strFolder)
Dim strTempFolderName

With objFSO
Do
strTempFolderName = .BuildPath(strFolder, .GetTempName)

'если такая папка существует, продолжаем попытки генерации пути:
Loop While .FolderExists(strTempFolderName)
End With

GetRandomSubFolderName = strTempFolderName
End Function
'=============================================================================

Автор: bomzzz
Дата сообщения: 21.09.2009 01:34
Gavigor
гавигорка поздравляю
Автор: Gavigor
Дата сообщения: 21.09.2009 01:53
bomzzz

гы...я уж отчаялся...

есть код (отслеживает подключение флеш):


Код:
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
colDrives = Split("D E F G H I J K L M N O P Q R S T U V W X Y Z")
Set dictDrives = CreateObject("Scripting.Dictionary")
For Each Drive In colDrives
Set Drv = FSO.GetDrive(Drive & ":")
If Err.Number Then
dictDrives.Add Drive & ":", False
Else
If Drv.DriveType = 1 And Drv.IsReady Then
dictDrives.Add Drive & ":", True
Else
dictDrives.Add Drive & ":", False
End If
End If
Err.Clear
Next
' Бесконечный цикл
While True
For Each Drive In dictDrives.Keys
Set Drv = FSO.GetDrive(Drive)
If (Err.Number) Or (Drv.IsReady = False) Or (Drv.DriveType <> 1) Then
Flag = False
Else
Flag = True
End If
Err.Clear
Current = dictDrives.Item(Drive)
If Current <> Flag Then
If Current = False And Flag = True Then
MsgBox "Флешка " & Drive & " ПОДКЛЮЧЕНА!" & vbCrLf & vbCrLf & vbCrLf & "Имя Флешки = " & Drv.VolumeName & vbCrLf & vbCrLf & "Файловая Система = " & Drv.FileSystem & vbCrLf & "Полный Объем = " & Drv.TotalSize & vbCrLf & "Свободно = " & Drv.FreeSpace ,48, "Диспетчер Флешек"
'WScript.Echo "FileSystem = " & Drv.FileSystem
'WScript.Echo "FreeSpace = " & Drv.FreeSpace
'WScript.Echo "TotalSize = " & Drv.TotalSize
'WScript.Echo "SerialNumber = " & Drv.SerialNumber
'WScript.Echo "VolumeName = " & Drv.VolumeName
Else
set oShell = WScript.CreateObject ("WScript.Shell")
oShell.Popup "Флешка " & Drive & " ОТКЛЮЧЕНА!", 3, "Диспетчер Флешек", 48
End If
dictDrives.Item(Drive) = Flag
End If
Next
WScript.Sleep 1000
Wend

Автор: bomzzz
Дата сообщения: 21.09.2009 02:26
паделить на 1024 кб или еще раз на 1024 байты.
если буква флешки не меняется и знать командную строку касперского можно, если меняет наверно будут праплемки - но решаемые скорее всего.
тут походу это и делается ("D E F G H I J K L M N O P Q R S T U V W X Y Z")

Цитата:

Set WshShell = CreateObject("WScript.Shell")
RetCode = WshShell.Run("C:\Program Files\Kasperskii.exe моя команда касперскому", 1, True)

вот такой код запускает программу
Значение Описание
0 Запуск в скрытом виде
1 Обычный размер окна, если окно свернуто или развернуто на весь экран, то ему возвращается исходный вид и положение на экране
2 Запуск в свернутом виде
3 Развернутое на весь экран
4 Запуск в обычном размере, в неактивном состоянии (без фокуса)
8 Обычный размер в неактивном состоянии, но в фокусе остается запустившее приложение

может принимать значение true или false, указывающее, следует ли сценарию дожидаться окончания выполнения запущенного приложения. true - выполнение сценария приостанавливается до тех пор, пока не будет закрыто запущенное приложение. false - не дожидаться.

если использовать RetCode = этой переменной присвоится код выхода (ошибки) из вызываемой программы
Автор: Gavigor
Дата сообщения: 21.09.2009 02:43

Цитата:
паделить на 1024 кб или еще раз на 1024 байты.

знать бы в каком месте кода делить....

Автор: bomzzz
Дата сообщения: 21.09.2009 02:52
"Полный Объем = " & Drv.TotalSize
вот в етам.
гавигорка, ты такую работу провернул по наитию - надо было простые задачи порешать и постепенно к сложным прийти.

result=100
result=result/10
MsgBox "полный объем"& result/10



"Полный Объем = " & Drv.TotalSize/1048576 & "мб"
если в байтах, что скорее всего
Автор: Gavigor
Дата сообщения: 21.09.2009 03:44

Цитата:

"Полный Объем = " & Drv.TotalSize/1048576 & "мб"


-тут все ок!

осталось запустить окно каспера с проверкой....
Автор: bomzzz
Дата сообщения: 21.09.2009 04:01
ну в конец скрипта прямо допиши код. командную строку каспера на сайте смотри его или в описании

код просматрел там нигде нет строки Wscript.Quit то есть он середины не выхоит значит дописаное после всего скрипа должно выполняца

ну тут не очевидно - вроде код перебирается разные тома. не совсем понятно когда он проверять то должен - наверно внутри какого цикла надо если несколько томов проверяется
Автор: kolyas
Дата сообщения: 21.09.2009 10:52
bomzzz

Цитата:
а кто посоветовал обращаться к яндексу?

привычка =)..

в общем накатал скрипт который начиная с определенного каталога и во всех вложенных каталогах в файлах с заданными расширениями меняет подходящие строки на нужное человеку..
те программы которые я видел не могли заменять массово по регулярным выражениям.
была задача узнать порядок ображения к функциям в cms Drupal (оказывается чтобы показать текст человеку запускается ~ 399 функций).
Как работает скрипт
ищем: function[\s]+([\w]+\(.*?\))[\s]*{
даписываем после { текст - в данном случае свою функцию php, в которой ведется подсчет обращений внутри cms.
http://narod.ru/disk/13359254000/finish_comment.vbs.html

скрипт не оптимизирован .. думаю есть более лучшие вариант исполнения ..
700 файлов изменил за 1-2 минуты (core e8300, 8ram,win7-64)
Автор: SANIOK_AV
Дата сообщения: 22.09.2009 15:57
Доброго времени суток!!!
а есть ли возможность зашифровать VBScript?
Автор: bomzzz
Дата сообщения: 22.09.2009 16:12
есть. но нельзя быть таким жадным
Автор: SANIOK_AV
Дата сообщения: 22.09.2009 16:48
bomzzz
)))
особенно когда в скрипте пароли прсутствуют...

ну как это можно сделать?
Автор: Integer27h
Дата сообщения: 22.09.2009 17:35

Цитата:
Доброго времени суток!!!
а есть ли возможность зашифровать VBScript?

PrimalScript. В этом редакторе есть ScriptPackager.
Автор: mozers
Дата сообщения: 22.09.2009 18:27
SANIOK_AV
Стандартный инструмент Script Encoder. Правда расшифровщики имеются...
Автор: bomzzz
Дата сообщения: 22.09.2009 23:01
сконвертировать в екзешник, у какого то конвертера есть режим кодировки добавочно - но не пользовался и чета не могу найти у какого.

Цитата:

http://www.abyssmedia.com/scriptcryptor/ вот этот самый лучший и корректный, с ключиком легко найти в инете, пользуюсь им как редактором - есть подсветка команд, скрипты вообще отключены на компе. минус - большие файлы получаются 180 кб, второй минус - на сконвертированные файлы ругаются антивирусы, касперскому наябедничал в канторку - он больше не ругается.

http://www.vbs2exe.com/ - вот тут есть кодировка , но тут часть команд неизвестна конвертеру и возможно переписывать скрипт придется. файлы получаются всего 10 кб с хвостиком, все известные мне ограничения на некоторые команды мне удалось обойти через ж. бисплантная. не выдает сообщений об ошибках - могут возникнуть сложности в отладке.

http://www.xneat.com/application-builder/ от этого не смог ключик найти и чета он косячный какой-та. посмотрел не пользуюсь.

но это не значит что нельзя расколупать при желании

может на каждого пользователя можно свой логин пароль сделать. то есть это к тому, что любая кодировка может быть взломана и само по себе неправильно распространять с программой пароль к банковскому счету на предъявителя.
Автор: SANIOK_AV
Дата сообщения: 23.09.2009 10:21
mozers
bomzzz

Спасибо!!!

а что скажете по поводу ExeScript?

как понять:

Цитата:
скрипты вообще отключены на компе

Автор: bomzzz
Дата сообщения: 23.09.2009 11:10
а вот так

екзескрип пробовал - дерьмо полное, екзешники с отключенными сриптами не работают
Автор: SANIOK_AV
Дата сообщения: 23.09.2009 11:12

Цитата:
и само по себе неправильно распространять с программой пароль к банковскому счету на предъявителя

в моём случае это пароль админа ОС
Автор: mozers
Дата сообщения: 23.09.2009 11:16
SANIOK_AV
ИМХО ExeScript - инструмент для тех, кто кроме как на VBS/JS писать не умеет, а очень хочет получить в результате exe-шник.

Цитата:
скрипты вообще отключены на компе
Т.е. не установлен (или отключен политикой) WSH.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475

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


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