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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопросы, задачи и их решения по VBScript.

 
Мануал (english, 600 Кб). | Зеркало
MS Scripting 5.6 (700 КБ), включает последнюю версию VBS. Владельцам XP/2000(?) должен быть не нужен. | Зеркало
Немного на wikiпедии.
Предыдущие части: 1
 
Смежные темы:
Сценарии Windows
Командная строка, батники\сценарии (bat, cmd)
Скрипты KiXtart

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 04:12 12-07-2011 | Исправлено: Smitis, 23:28 26-02-2018
a929151



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну не знаю, у меня работает
 
   
 
windows 10 x64 (1803)
 
Сработал на chart2016-kb3114706-fullfile-x64-glb.exe, на chart-x-none.msp тоже пустое поле

Всего записей: 1359 | Зарегистр. 30-03-2016 | Отправлено: 13:07 01-04-2018 | Исправлено: a929151, 13:15 01-04-2018
5peciali5t



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
a929151
вот и я думаю, как так, разные ОС и разрядности перепробовал на виртуалках, нигде не сработало - везде пустая строка.
мне необходимо собирать с распакованных обновлений в формате msp

Всего записей: 1472 | Зарегистр. 17-07-2009 | Отправлено: 13:34 01-04-2018
5peciali5t



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
a929151
спасибо за помощь и участие!
в итоге решил остановиться на варианте, который предложил Pasha_ZZZ, за что ему огромное спасибо!
запускаю командный файл сл. содержания

Код:
 
@Echo Off
color 0B
mode con:cols=100 lines=30
Title Установка обновлений для Microsoft Office 2010
for /f %%i in ('dir /b /O-s Updates\*.msp') do (Call :SetupUpd %%i)
 
:SetupUpd
for /f "tokens=*" %%a in ('cscript description.vbs //B //NoLogo Updates\%1') do set "MSPName=%%a"
echo Устанавливается %MSPName%
Updates\%1 /qn /norestart
if %errorlevel% neq 0 Echo %1 installation error >>"%temp%\MSO_Update_Error_Log.txt"  
GoTo :EOF

 
и рядом файл description.vbs сл. содержания

Код:
 
Const MSIOPENDATABASEMODE_PATCHFILE = 32
Set oMsi = CreateObject("WindowsInstaller.Installer")
Set msp = oMsi.OpenDatabase(WScript.Arguments(0),MSIOPENDATABASEMODE_PATCHFILE)
Set qView = msp.OpenView("SELECT `Property`,`Value` FROM MsiPatchMetadata WHERE `Property`='Description'")
qView.Execute : Set record = qView.Fetch()
WScript.StdOut.WriteLine record.StringData(2)
 

 
вывод получается такой:

Код:
 
Устанавливается Update for Microsoft Outlook 2010 (KB4018314) 32-Bit Edition
Устанавливается Update for Microsoft SharePoint Workspace 2010 (KB2878231) 32-Bit Edition
Устанавливается Service Pack 2 for Microsoft Office 2010 (KB2687455) 32-Bit Edition
Устанавливается Service Pack 2 for Microsoft Visio 2010 (KB2687468) 32-Bit Edition
Устанавливается Security Update for Microsoft Office 2010 (KB3203468) 32-Bit Edition
 

Всего записей: 1472 | Зарегистр. 17-07-2009 | Отправлено: 16:56 03-04-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. Для скачивания файлов иногда использую скрипт-CMD, запускающий wget и работающий в связке с scriptsplit.vbs. Программа скачивает список ссылок из файла lst.txt — в новый файл со случайным именем, по достижении квоты в 399мб — создавая и наполняя новый файл.
 
Файл "start.cmd"

Код:
 
"G:\_wget\wget.exe" --user-agent="Mozilla/5.0 (Windows NT 5.1; rv:26.0) Gecko/20100101 Firefox/26.0 SeaMonkey/2.23" --header="Accept-Language: ru-RU,ru;q=0.9,en;q=0.8" --wait=1 --rejected-log=_ERROR.LOG -i lst.txt -O- | cscript scriptsplit.vbs
 

Файл "scriptsplit.vbs"

Код:
 
SplitSize = 399 * 1024 * 1024  
 Set FSO = CreateObject("Scripting.FileSystemObject")  
 Set stdin = fso.GetStandardStream(0)  
 Count = 0  
 Set CurrFile = FSO.CreateTextFile("lst" & CStr(Year(Date())) & "-" & Right("0" & CStr(Month(Date())), 2) & "-" & Right("0" & CStr(Day(Date())), 2) & "_" & Replace(Time,":","-") & Count & ".htm",1)  
 Do Until stdin.AtEndOfStream  
   CurrFile.Write stdin.Read(1024)  
   Size = Size + 1024  
   If (Size => SplitSize) Then  
     Count = Count + 1  
     CurrFile.Close  
     Set CurrFile = FSO.CreateTextFile("lst" & CStr(Year(Date())) & "-" & Right("0" & CStr(Month(Date())), 2) & "-" & Right("0" & CStr(Day(Date())), 2) & "_" & Replace(Time,":","-") & Count & ".htm",1)  
     Size = 0 : Data = ""  
   End If  
 Loop  
 CurrFile.Close
 

Вопрос заключается в возможности изменения условия скачивания: этой функции квоты — на скачанное количество ссылок, чтобы новый файл создавался не в зависимости от размера файла, а в зависимости от числа скачанных ссылок. Потому что иначе HTML-файлы перед последующей обработкой приходится объединять, поскольку они разрываются в случайном месте, помимо того, что иногда кодировка файлов слетает.
 
UPD: Сейчас подумалось: в плане производительности не было бы эффективней и проще считать не ссылки — а время с момента создания активного файла? Чтобы запоминалось время, когда текущий наполняемый файл был создан — и если с момента его создания прошло больше трёх часов — создавался бы новый файл? Подошёл бы и такой формат.

Всего записей: 1368 | Зарегистр. 05-04-2010 | Отправлено: 06:03 05-04-2018 | Исправлено: D1D1D1D, 09:17 05-04-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сейчас подумалось: в плане производительности не было бы эффективней и проще считать не ссылки — а время с момента создания активного файла? Чтобы запоминалось время, когда текущий наполняемый файл был создан — и если с момента его создания прошло больше трёх часов — создавался бы новый файл? Подошёл бы и такой формат.

Всего записей: 1368 | Зарегистр. 05-04-2010 | Отправлено: 09:16 05-04-2018
Proshaa

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D
нифига не понял - что вы качаете и зачем? просто выкачиваете страницы? или файлы? а зачем сливать их в один файл?

Всего записей: 3079 | Зарегистр. 10-01-2011 | Отправлено: 10:44 05-04-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Proshaa
Да, качаю страницы HTML с помощью WGET. Сливаю в один файл, потому что для некоторых задач это более удобно: к примеру, скачать 100 тысяч файлов с мусором на страницах, а потом извлечь из них с PowerGrep только нужные фрагменты, формируя файлы на лету и т.п.

Всего записей: 1368 | Зарегистр. 05-04-2010 | Отправлено: 10:56 05-04-2018 | Исправлено: D1D1D1D, 10:57 05-04-2018
Proshaa

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D
так и думал: ИМХО вы выбрали не тот инструмент, создав себе головную боль.  
я бы для такой задачи взял HTTrack website copier - можно очень тонко настроить что качать и что не качать (по типам файлов), "глубину" погружения по ссылкам на страницах, авторизацию (если нужна), не качает "перекрёстки" - т.е. если какой-то ресурс (например - картинка) уже скачан для одной страницы сайта, то для остальных он не будет перекачиваться заново. так же - если уже что-то удалили руками - тоже не перекачивает. умеет синхронизировать скачанное с обновлениями на сайте. продолжение прерванной закачки и ещё много-много всякого всего.
изначально управление через командную строку, но есть и GUI от автора - практически полный.
ваш скрипт не контролирует что качает: vbs получает "поток" от wget и тупо его сохраняет. какой критерий ограничений не выберете - будет рвать файлы. единственный вариант - ручной - т.е. вы "накидываете" ссылок на заведомо меньший размер, чем лимит. но тогда вам и vbs не особо нужен - разве что, чтобы склеить всё в кучу.

Всего записей: 3079 | Зарегистр. 10-01-2011 | Отправлено: 13:00 05-04-2018
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Proshaa
 
Почему это в некоторых случаях не головная боль, а удобство — я уже пояснил. Для остального есть ещё более удобный (нежели HTTrack) MetaProducts Offline Explorer.
 
Добавлено:
Критерий по дате создания файла сработал бы, потому что проверка производилась бы перед или после скачивания файла.

Всего записей: 1368 | Зарегистр. 05-04-2010 | Отправлено: 13:29 05-04-2018 | Исправлено: D1D1D1D, 13:34 05-04-2018
Proshaa

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

Цитата:
есть ещё более удобный (нежели HTTrack) MetaProducts Offline Explorer.

возможно - вам видней, правда он слегка платный, в отличии от ))

Цитата:
Критерий по дате создания файла сработал бы...

он как бы и так работает: файл создаётся в момент начала скачивания и содержит в своём имени ту самую дату. теретически - добавить ограничение "времени жизни" - несложно. но опять-таки: откуда вы можете знать, в какой момент времени закончится закачка одного линка и начнётся следующий? ведь скрипт получает поток.

Всего записей: 3079 | Зарегистр. 10-01-2011 | Отправлено: 17:43 05-04-2018
D1D1D1D

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

Цитата:
знать, в какой момент времени закончится закачка одного линка и начнётся следующий?  

Получается, тогда проверка по времени отпадает и остаётся вариант с подсчётом ссылок. А с ним мне на stackoverflow подсказали код — только его так и не удалось задействовать. Может взглянет кто, потому что в таком виде не работает:

Код:
 
Const ReferencesCount = 1000000 ' ссылок на файл '
Dim Buffer ' буфер приёма и парсинга ссылок '
Dim NextRef ' буфер под выделение ссылки '
Dim RefCount ' количество ссылок, записанных в файл '
Dim FSO,stdin,Count,CurrFile ' переменные из исходного кода '
 
Set FSO = CreateObject("Scripting.FileSystemObject")  
Set stdin = FSO.GetStandardStream(0)  
Count = 0  
Set CurrFile = FSO.CreateTextFile("lst" & CStr(Year(Date())) & "-" & Right("0" & CStr(Month(Date())), 2) & "-" & Right("0" & CStr(Day(Date())), 2) & "_" & Replace(Time,":","-") & Count & ".htm",1)  
Do Until stdin.AtEndOfStream  
    Buffer = Buffer & stdin.Read(1024)
    NextRef = ExtractRef(Buffer)
    Do Until NextRef = ""
        CurrFile.Write NextRef & vbNewLine ' по одной ссылке на строку '
        RefCount = RefCount + 1
        If RefCount>= ReferencesCount Then
            CurrFile.Close
            Count = Count + 1
            Set CurrFile = FSO.CreateTextFile("lst" & CStr(Year(Date())) & "-" & Right("0" & CStr(Month(Date())), 2) & "-" & Right("0" & CStr(Day(Date())), 2) & "_" & Replace(Time,":","-") & Count & ".htm",1)  
            RefCount = 0
        End If
        NextRef = ExtractRef(Buffer)
    Loop
Loop  
CurrFile.Close
 
Function ExtractRef(ByRef Buffer)
Dim Border ' Граница первой ссылки в буфере '
 
Buffer = Trim(Buffer)
Border = Instr(Buffer, " ") ' если разделитель ссылок - пробел '
If Border = 0 Then  
    ExtractRef = ""
Else
    ExtractRef = Trim(Left(Buffer, Border))
    Buffer = Mid(Buffer, Border)
End If
End Function


Всего записей: 1368 | Зарегистр. 05-04-2010 | Отправлено: 19:11 05-04-2018 | Исправлено: D1D1D1D, 19:14 05-04-2018
Proshaa

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

Цитата:
так и не удалось задействовать

в коде ограничение - миллион ссылок. поставьте (для тестов), скажем, 5 и проверяйте.

Код:
Const ReferencesCount = 5 ' ссылок на файл '  

Всего записей: 3079 | Зарегистр. 10-01-2011 | Отправлено: 20:23 05-04-2018
D1D1D1D

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

Всего записей: 1368 | Зарегистр. 05-04-2010 | Отправлено: 20:55 05-04-2018
VidelSamogO



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть скрипт чистки папки кэша.

Код:
DelFolderCache2entries.vbs [line 1] :
Код:
Set FileSys = CreateObject("Scripting.FileSystemObject")
Set
objSourceFolder = FileSys.GetFolder("j:\UTL\111\km76-goanna341-bin\Profiles\ikbhletk.default\cache2")
FileSys.DeleteFolder objSourceFolder
WScript.Sleep 60000*0.03
set fso = createobject ("scripting.filesystemobject")
fso.createfolder "j:\UTL\111\km76-goanna341-bin\Profiles\ikbhletk.default\cache2"
fso.createfolder "j:\UTL\111\km76-goanna341-bin\Profiles\ikbhletk.default\cache2\entries"
fso.createfolder "j:\UTL\111\km76-goanna341-bin\Profiles\ikbhletk.default\cache2\doomed"
 
 ?
Нужно чтобы он работал относительно места расположения скрипта. Для портабельности.

Всего записей: 765 | Зарегистр. 16-08-2008 | Отправлено: 17:05 13-04-2018 | Исправлено: VidelSamogO, 17:14 13-04-2018
a929151



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

Код:
Set FSO = CreateObject("Scripting.FileSystemObject")
Set F = FSO.GetFile(Wscript.ScriptFullName)
Wscript.Echo  FSO.GetParentFolderName(F) + "\"

Всего записей: 1359 | Зарегистр. 30-03-2016 | Отправлено: 17:32 13-04-2018
VidelSamogO



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
a929151
Этот скрипт я знаю. Как мне его вставить в свой, чтобы работало при запуске из папки "km76-goanna341-bin"?

Всего записей: 765 | Зарегистр. 16-08-2008 | Отправлено: 19:08 13-04-2018 | Исправлено: VidelSamogO, 19:15 13-04-2018
a929151



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

Код:
FSO.GetParentFolderName(F) + "\"

папка в которой находится ваш скрипт

Всего записей: 1359 | Зарегистр. 30-03-2016 | Отправлено: 19:16 13-04-2018
VidelSamogO



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

Цитата:
папка в которой находится ваш скрипт
Это понятно. Но что писать вместо полных путей, если я перемещу браузер в другое место?  
 

Всего записей: 765 | Зарегистр. 16-08-2008 | Отправлено: 19:18 13-04-2018 | Исправлено: VidelSamogO, 19:29 13-04-2018
Tilks

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

Код:
dim dir
Set FileSys = CreateObject("Scripting.FileSystemObject")  
Set F = FileSys.GetFile(Wscript.ScriptFullName)  
dir = FileSys.GetParentFolderName(F)
Set objSourceFolder = FileSys.GetFolder(dir & "\Profiles\ikbhletk.default\cache2")  
FileSys.DeleteFolder objSourceFolder  
WScript.Sleep 60000*0.03  
FileSys.createfolder dir & "\Profiles\ikbhletk.default\cache2"  
FileSys.createfolder dir & "\Profiles\ikbhletk.default\cache2\entries"  
FileSys.createfolder dir & "\Profiles\ikbhletk.default\cache2\doomed"  

Всего записей: 2688 | Зарегистр. 14-08-2005 | Отправлено: 19:25 13-04-2018
a929151



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FSO.GetParentFolderName(F) + "\" + "относительный путь к папке ..\cache2"

Всего записей: 1359 | Зарегистр. 30-03-2016 | Отправлено: 19:26 13-04-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование "удобняшек" на VBScript (Часть 2)


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru