Пару скриптов на vbs для поиска, загрузки и установки обновлений и драйверов
Search for Driver Updates
Set objSearcher = CreateObject("Microsoft.Update.Searcher") Set objResults = objSearcher.Search("Type='Driver'") Set colUpdates = objResults.Updates If colUpdates.Count = 0 Then _ Wscript.Echo colUpdates.Count & " тю-тю" For i = 0 to colUpdates.Count - 1 Wscript.Echo "Title: " & colUpdates.Item(i).Title Wscript.Echo "Autoselect on Web sites: " & _ colUpdates.Item(i).AutoSelectOnWebSites For Each strUpdate in colUpdates.Item(i).BundledUpdates Wscript.Echo "Bundled update: " & strUpdate Next Wscript.Echo "Can require source: " & colUpdates.Item(i).CanRequireSource Set objCategories = colUpdates.Item(i).Categories For z = 0 to objCategories.Count - 1 Wscript.Echo "Category name: " & objCategories.Item(z).Name Wscript.Echo "Category ID: " & objCategories.Item(z).CategoryID For Each strChild in objCategories.Item(z).Children Wscript.Echo "Child category: " & strChild Next Wscript.Echo "Category description: " & _ objCategories.Item(z).Description Wscript.Echo "Category order: " & objCategories.Item(z).Order Wscript.Echo "Category type: " & objCategories.Item(z).Type Next Wscript.Echo "Deadline: " & colUpdates.Item(i).Deadline Wscript.Echo "Delta compressed content available: " & _ colUpdates.Item(i).DeltaCompressedContentAvailable Wscript.Echo "Delta compressed content preferred: " & _ colUpdates.Item(i).DeltaCompressedContentPreferred Wscript.Echo "Description: " & colUpdates.Item(i).Description Wscript.Echo "EULA accepted: " & colUpdates.Item(i).EULAAccepted Wscript.Echo "EULA text: " & colUpdates.Item(i).EULAText Wscript.Echo "Handler ID: " & colUpdates.Item(i).HandlerID Set objIdentity = colUpdates.Item(i).Identity Wscript.Echo "Revision number: " & objIdentity.RevisionNumber Wscript.Echo "Update ID: " & objIdentity.UpdateID Set objInstallationBehavior = colUpdates.Item(i).InstallationBehavior Wscript.Echo "Can request user input: " & _ objInstallationBehavior.CanRequestUserInput Wscript.Echo "Impact: " & objInstallationBehavior.Impact Wscript.Echo "Reboot behavior: " & objInstallationBehavior.RebootBehavior Wscript.Echo "Requires network connectivity: " & _ objInstallationBehavior.RequiresNetworkConnectivity Wscript.Echo "Is beta: " & colUpdates.Item(i).IsBeta Wscript.Echo "Is hidden: " & colUpdates.Item(i).IsHidden Wscript.Echo "Is installed: " & colUpdates.Item(i).IsInstalled Wscript.Echo "Is mandatory: " & colUpdates.Item(i).IsMandatory Wscript.Echo "Is uninstallable: " & colUpdates.Item(i).IsUninstallable For Each strLanguage in colUpdates.Item(i).Languages Wscript.Echo "Supported language: " & strLanguage Next Wscript.Echo "Last deployment change time: " & _ colUpdates.Item(i).LastDeploymentChangeTime Wscript.Echo "Maximum download size: " & colUpdates.Item(i).MaxDownloadSize Wscript.Echo "Minimum download size: " & colUpdates.Item(i).MinDownloadSize Wscript.Echo "Microsoft Security Response Center severity: " & _ colUpdates.Item(i).MsrcSeverity Wscript.Echo "Recommended CPU speed: " & _ colUpdates.Item(i).RecommendedCPUSpeed Wscript.Echo "Recommended hard disk space: " & _ colUpdates.Item(i).RecommendedHardDiskSpace Wscript.Echo "Recommended memory: " & colUpdates.Item(i).RecommendedMemory Wscript.Echo "Release notes: " & colUpdates.Item(i).ReleaseNotes Wscript.Echo "Support URL: " & colUpdates.Item(i).SupportURL Wscript.Echo "Type: " & colUpdates.Item(i).Type Wscript.Echo "Uninstallation notes: " & _ colUpdates.Item(i).UninstallationNotes x = 1 For Each strStep in colUpdates.Item(i).UninstallationSteps Wscript.Echo x & " -- " & strStep x = x + 1 Next For Each strArticle in colUpdates.Item(i).KBArticleIDs Wscript.Echo "KB article: " & strArticle Next Wscript.Echo "Deployment action: " & colUpdates.Item(i).DeploymentAction Wscript.Echo Next
Search Updates
If Not CSI_IsAdmin() Then Set objShell = CreateObject("Shell.Application") objShell.ShellExecute "wscript.exe", Chr(34) & WScript.ScriptFullName & Chr(34) & " Run", , "runas", 1 Set objShell = Nothing Else strQvery = MsgBox("Поиск обновлений... (Да/Нет)",36) If (strQvery = 6) Then Set updateSession = CreateObject("Microsoft.Update.Session") updateSession.ClientApplicationID = "MSDN Sample Script" Set updateSearcher = updateSession.CreateUpdateSearcher() Set searchResult = updateSearcher.Search("IsInstalled=0 and Type='Software' And IsHidden=0 And BrowseOnly=0") If searchResult.Updates.Count<>0 Then Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") Set colItemms = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem") For Each i in colItemms Version = i.Version Name = i.Caption Next StartTime = Timer set FSO = CreateObject("Scripting.FileSystemObject") CurDir = FSO.GetParentFolderName(WScript.ScriptFullName) ProdName = CreateObject("WScript.Shell").RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName") set outFile = FSO.OpenTextFile(CurDir & "\Update_"+ProdName+".txt", 2, True) str = "Перечень применимых обновлений:" & VbCrLf outFile.WriteLine VbCrLf & "Имя: " & Name & VbCrLf & "Версия Windows: " & Version _ & VbCrLf & "Доверенное время: " & Date & " " & Time & VbCrLf & String(len("Имя: " & Name), "=") & VbCrLf outFile.WriteLine "Перечень применимых обновлений: " & searchResult.Updates.Count & VbCrLf For I = 0 To searchResult.Updates.Count-1 Set update = searchResult.Updates.Item(I) Set objCategories = update.Categories str = str & VbCrLf & I + 1 & "> " & update.Title outFile.WriteLine "Update info :" & VbCrLf & String(len("Update info :"), "=") & VbCrLf outFile.WriteLine "<Имя>" & update.Title & "</Имя>" outFile.WriteLine "<Категория>" & objCategories.Item(0).Name & "</Категория>" outFile.WriteLine "<Статус>" & Code2Text(update.MsrcSeverity) & "</Статус>" outFile.WriteLine "<Скрытое>" & update.IsHidden & "</Скрытое>" outFile.WriteLine "<Описание>" & update.Description & "</Описание>" outFile.WriteLine "<Приоретет загрузки>" & Code1Text(update.DownloadPriority) & "</Приоретет загрузки>" outFile.WriteLine "<загружено>" & update.IsDownloaded & "</загружено>" outFile.WriteLine "<Максимальный размер закачивания>" & ConvertSize(update.MaxDownloadSize) & "</Максимальный размер закачивания>" outFile.WriteLine "<Минимальный размер закачивания>" & ConvertSize(update.MinDownloadSize) & "</Минимальный размер закачивания>" outFile.WriteLine "<Дата создания>" & update.LastDeploymentChangeTime & "</Дата создания>" For Each strArticle in update.KBArticleIDs outFile.WriteLine "<KB article>" & strArticle & "</KB article>" Next outFile.WriteLine vbCRLF Next End If If searchResult.Updates.Count = 0 Then WScript.Echo "Нет обновлений." WScript.Quit() Else WScript.Echo str End If Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl") str1 = vbCRLF & "Создание набора обновлений для загрузки:" & vbCRLF For I = 0 to searchResult.Updates.Count-1 Set update = searchResult.Updates.Item(I) addThisUpdate = false If update.InstallationBehavior.CanRequestUserInput = true Then WScript.Echo I + 1 & "> пропуск: " & update.Title & _ " потому что он требует ввода данных пользователем" Else If update.EulaAccepted = false Then WScript.Echo I + 1 & "> примечание: " & update.Title & _ " имеет лицензионное соглашение, которое должно быть принято:" WScript.Echo update.EulaText strInput = MsgBox("Принимаете ли вы это лицензионное соглашение? (Да/Нет)",36) If (strInput = 6) Then update.AcceptEula() addThisUpdate = true Else WScript.Echo I + 1 & "> пропуск: " & update.Title & _ " потому что лицензионное соглашение было отклонено" End If Else addThisUpdate = true End If End If If addThisUpdate = true Then If Not (LCase(Code2Text(update.MsrcSeverity)="рекомендуемое") or LCase(Code2Text(update.MsrcSeverity)="необязательное")) Then str1 = str1 & vbCRLF & I + 1 & "> выбрано: " & update.Title updatesToDownload.Add(update) End If End If Next If updatesToDownload.Count = 0 Then WScript.Echo "Все необходимые обновления были пропущены." WScript.Quit() Else WScript.Echo str1 End If 'WScript.Echo vbCRLF & "Загрузка обновлений..." Set downloader = updateSession.CreateUpdateDownloader() downloader.Updates = updatesToDownload On Error Resume Next downloader.Download() If Err.Number <> 0 Then WScript.Echo Err.Description WScript.Quit 4 End If On Error Goto 0 Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl") rebootMayBeRequired = false EndTime = Timer - StartTime test = strGetTime(EndTime) strtmp = VbCrLf For I = 0 To searchResult.Updates.Count-1 set update = searchResult.Updates.Item(I) If update.IsDownloaded = true Then strtmp = strtmp & VbCrLf & I + 1 & "> " & update.Title & VbCrLf & "Загружено: " & update.IsDownloaded & VbCrLf updatesToInstall.Add(update) If update.InstallationBehavior.RebootBehavior > 0 Then rebootMayBeRequired = true End If End If Next If updatesToInstall.Count = 0 Then WScript.Echo "Обновления не были загружены." WScript.Quit() Else outFile.WriteLine "Успешно загруженные обновления: " & updatesToInstall.Count & VbCrLf & String(len("Успешно загруженные обновления :" & updatesToInstall.Count), "=") & VbCrLf & strtmp outFile.WriteLine VbCrLf & "Общее время загрузки обновления :" & VbCrLf & String(len("Общее время загрузки обновления :"), "=") _ & VbCrLf & VbCrLf & "Время загрузки: " & test WScript.Echo "Успешно загруженные обновления: " & updatesToInstall.Count & VbCrLf & String(len("Успешно загруженные обновления :"), "=") & VbCrLf & strtmp End If If rebootMayBeRequired = true Then WScript.Echo vbCRLF & "Этим обновлениям может потребоваться перезагрузка." End If strInput = MsgBox("Хотите установить обновления сейчас? (Да/Нет)",36) If (strInput = 6) Then 'WScript.Echo "Установка обновления..." StartTime1 = Timer Set installer = updateSession.CreateUpdateInstaller() installer.Updates = updatesToInstall Set installationResult = installer.Install() EndTime1 = Timer - StartTime1 test1 = strGetTime(EndTime1) 'WScript.Echo "Требуется перезагрузка: " & installationResult.RebootRequired & vbCRLF 'WScript.Echo "Просмотр установленных обновлений " Install = vbCRLF For I = 0 to updatesToInstall.Count - 1 Select Case InstallationResult.GetUpdateResult(i).ResultCode Case 0 ResultDescription = "Не начато" Case 1 ResultDescription = "В процессе" Case 2 ResultDescription = "Успешно установлено" Case 3 ResultDescription = "Установлено с ошибками" Case 4 ResultDescription = "Не удалось" Case 5 ResultDescription = "Отменено" End Select Install = Install & vbCRLF & I + 1 & "> " & updatesToInstall.Item(i).Title & ": " & ResultDescription & vbCRLF _ & "Требуется перезагрузка: " & InstallationResult.GetUpdateResult(i).RebootRequired If InstallationResult.GetUpdateResult(i).RebootRequired = True Then blnRebootRequired = True Next Else WScript.Quit() End If WScript.Echo Install outFile.WriteLine vbCRLF & "Установленые обновления :" & updatesToInstall.Count & vbCRLF & String(len("Установленые обновления :" & updatesToInstall.Count), "=") & Install outFile.WriteLine VbCrLf & "Общее время установки обновления :" & VbCrLf & String(len("Общее время установки обновления :"), "=") _ & VbCrLf & VbCrLf & "Время установки: " & test1 outFile.Close If blnRebootRequired = true Then strInp = MsgBox("Перезагрузить компьютер сейчас? (Да/Нет)",36, "Требуется перезагрузка") If (strInp = 6) Then Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}!\\.\root\cimv2") Set colOperatingSystems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem") For Each objOperatingSystem in colOperatingSystems objOperatingSystem.Reboot(): WScript.Quit() Next End If End If Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "notepad " & CurDir & "\Update_"+ProdName+".txt" Set WshShell = Nothing WScript.Quit() Function Code2Text(iCode) If iCode = "Critical" Then Code2Text = "Критическое" If iCode = "Important" Then Code2Text = "Важное" If iCode = "Low" Then Code2Text = "Необязательное" If iCode = "Moderate" Then Code2Text = "Рекомендуемое" If iCode = "Unspecified" Then Code2Text = "Не выбрано" End Function Function Code1Text(jCode) Select Case jCode Case 1 Code1Text = "Низкий" Case 2 Code1Text = "Нормальный" Case 3 Code1Text = "Высокий" End Select End Function Function ConvertSize(Size) Size = CSng(Replace(Size,",","")) If Not VarType(Size) = vbSingle Then ConvertSize = "SIZE INPUT ERROR" Exit Function End If Suffix = " Bytes" If Size >= 1024 Then suffix = " KB" If Size >= 1048576 Then suffix = " MB" If Size >= 1073741824 Then suffix = " GB" If Size >= 1099511627776 Then suffix = " TB" Select Case Suffix Case " KB" Size = Round(Size / 1024, 1) Case " MB" Size = Round(Size / 1048576, 1) Case " GB" Size = Round(Size / 1073741824, 1) Case " TB" Size = Round(Size / 1099511627776, 1) End Select ConvertSize = Size & Suffix End Function Function strGetTime(dtTimer) Hours = dtTimer \ (60 * 60) Minutes = (dtTimer - (Hours * (60 * 60))) \ 60 Seconds = Fix(dtTimer - (Hours * (60 * 60)) - Minutes * 60) 'MilliSeconds = Fix((dtTimer - Fix(dtTimer)) * 1000) strtmp = Hours & ":" & Minutes & ":" & Seconds str = split(strtmp,":") if str(0) = 0 And str(1) = 0 Then Times = str(2) & " сек." elseif str(0) = 0 And str(1) <> 0 Then Times = str(1) & " мин." & " " & str(2) & " сек." else Times = str(0) & " ч." & " " & str(1) & " мин." & " " & str(2) & " сек." End If strGetTime = Times End Function Else WScript.Quit() End If End If ' Проверка прав Администратора. Private Function CSI_IsAdmin() Dim Key CSI_IsAdmin = False On Error Resume Next Key = CreateObject("WScript.Shell").RegRead("HKEY_USERS\S-1-5-19\Environment\TEMP") If (Err.Number = 0) Then CSI_IsAdmin = True End Function
Создает .cmd файл для восстановления (к предыдущему состоянию) ассоциаций файлов. Удобно если хотите вернуть ассоциации файлов до запуска той или иной программы.
@echo off SetLocal EnableExtensions echo @echo off> myassoc.cmd For /F "delims=" %%? in ('assoc') do echo assoc %%?>> myassoc.cmd echo Exit /B>>myassoc.cmd
@echo off SetLocal EnableExtensions for /f "tokens=2 delims=:" %%i in ('chcp') do set sPrevCP=%%i& chcp 1251 >nul for /f "usebackq delims=" %%i in (`mshta.exe "about:<input type=file id=F><script>F.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(F.value);close();</script>" ^|more`) do ( set file=%%i ) chcp %sPrevCP% >nul if defined file ( echo Выбран файл: %file% ) else ( echo Файл не был выбран. ) pause >NUL goto :eof
loban_ser Проверил на win10x64, работает. Какая система? А что выдает? В первой строке перед тестом поставьте @echo on SetLocal EnableExtensions не нужен.
66496файл надо не выбирать, а тащить-и-бросать в консольное окно.
мильпардон не знал. Выбор диалогового окна папки:
@echo off for /f "tokens=2 delims=:" %%i in ('chcp') do ( set sPrevCP=%%i chcp 1251 >nul ) for /f "usebackq delims=" %%I in (`@mshta "javascript:var objShellApp = new ActiveXObject('Shell.Application');var Folder = objShellApp.BrowseForFolder(0, 'SELECT TARGET FOLDER',1, '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}');try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Folder.Self.Path)};catch (e){};close();"^|MORE`) do set sFolderName=%%I chcp %sPrevCP% >nul if defined sFolderName ( echo Выбрана папка: %sFolderName% ) else ( echo Папка не была выбрана. ) pause >NUL goto :eof
@set @x=0/* set FolderName=& for /f "delims=" %%i in ( 'cscript.exe //nologo //e:jscript %0 "Выберите или создайте папку."' ) do set "FolderName=%%i" if defined FolderName echo Выбрана папка: "%FolderName%"& pause exit */ var dir = WScript.CreateObject("Shell.Application").BrowseForFolder(0, WScript.Arguments(0), 1, 17); if (dir != null) { WScript.Echo(dir.Self.Path) }
Камрады, хочу предложить простенький API для работы с imdisk в батниках. Заточен под маппирование ISO, но легко можно добавить ключик для маппирования образов с партициями. Используются только три файла из дистриба imdisk для каждой разрядности. Никаких следов в системе. Ничего никуда не копируется/не удаляется. Разумеется, только от имени Админа. Никаких проверок в код не вставлял для максимальной облегченности и простоты. Внимание! Это не программа для пользователей, это код для разработчиков. --- Если "велосипед", прошу простить покорно. UPD 1 Внёс изменения в общую структуру: разнёс библиотеку и пример использования (так проще подцепить библиотеку к готовым проектам, например). Мелкие правки шероховатостей, несущественно. UPD 2 Скрипт переехал сюда.
Последний раз редактировалось: Ander_73 (2019-05-12 14:48), всего редактировалось 1 раз
Ander_73, В батнике используется sc.exe - но он есть не во всех сборках, эта проблема обсуждалась в теме по Acronis. Лучше-бы обойтись без него, например использовать inf файл, ("%SystemRoot%\system32\rundll32.exe" setupapi.dll,InstallHinfSection DefaultInstall 132 imdisk.inf), немного поправив inf файл. Еще, как вариант, моя утилита, позволяет обойтись без sc.exe и net.exe, писал ее как-раз для подобных целей.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы