[Quote]

    loban_ser
  • 17796
  • Longevity: 6 years 11 months
  • Posts: 577
  • REPUTATION:24

    [+] [-]
Исправил код в сообщении Узнать букву флешки

[Quote]

    Ander_73
  • 15549
  • Longevity: 7 years 11 months
  • Posts: 3928
  • REPUTATION:127

    [+] [-]
Просто, чтоб не пропало.
Предлагаю универсальный проверяльщик админских прав:
:check_admin_rights
for %%i in (%SystemRoot%\System32\reg.exe) do ^
if exist %%i (
>nul 2>&1 (%%i add hklm /f&& %%i delete hklm /ve /f)|| exit /b 1
) else (
>nul 2>&1 (>%%i rem/&& del /q %%i)|| exit /b 1
)
exit /b

Использование:
call :check_admin_rights&& echo Admin rights exist!|| echo Admin rights required!

[Quote]

    loban_ser
  • 17796
  • Longevity: 6 years 11 months
  • Posts: 577
  • REPUTATION:24

    [+] [-]
Пару скриптов на 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

Warning from nikzzzz


Выкладывая скрипты, добавляйте к ним хотя-бы краткое описание, или добавляйте его в сам скрипт.

[Quote]

    loban_ser
  • 17796
  • Longevity: 6 years 11 months
  • Posts: 577
  • REPUTATION:24

    [+] [-]
Создает .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

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years
  • Posts: 3114
  • REPUTATION:127

    [+] [-]
Тут как-то мне задали вопрос, можно ли в батнике сделать GUI выбор файла без использования сторонних утилит.
Может кому пригодится.
@echo off
start "Select file" explorer.exe
set /p file="Drag file here : "
echo;%file%
pause

[Quote]

    loban_ser
  • 17796
  • Longevity: 6 years 11 months
  • Posts: 577
  • REPUTATION:24

    [+] [-]
nikzzzz,
не работает ai
@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

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years
  • Posts: 3114
  • REPUTATION:127

    [+] [-]
loban_ser
Проверил на win10x64, работает.
Какая система?
А что выдает?
В первой строке перед тестом поставьте @echo on
SetLocal EnableExtensions не нужен.

[Quote]

    Ander_73
  • 15549
  • Longevity: 7 years 11 months
  • Posts: 3928
  • REPUTATION:127

    [+] [-]
loban_ser, файл надо не выбирать, а тащить-и-бросать в консольное окно.

[Quote]

    loban_ser
  • 17796
  • Longevity: 6 years 11 months
  • Posts: 577
  • REPUTATION:24

    [+] [-]
66495Какая система?
win10x64
не работает именно ваш код.
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

[Quote]

    Ander_73
  • 15549
  • Longevity: 7 years 11 months
  • Posts: 3928
  • REPUTATION:127

    [+] [-]
loban_ser, чудовищный конструкт, имхо.
Вот же ж:
@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) }

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years
  • Posts: 3114
  • REPUTATION:127

    [+] [-]
Все бы хорошо, но нет гарантии, что комбинированные батники будут корректно работать в WinPe. ac

[Quote]

    loban_ser
  • 17796
  • Longevity: 6 years 11 months
  • Posts: 577
  • REPUTATION:24

    [+] [-]
66501что комбинированные батники будут корректно работать в WinPe
Может если только на сильно порезанных ah
а так-то работают:

[Quote]

    Ander_73
  • 15549
  • Longevity: 7 years 11 months
  • Posts: 3928
  • REPUTATION:127

    [+] [-]
Камрады, хочу предложить простенький API для работы с imdisk в батниках. Заточен под маппирование ISO, но легко можно добавить ключик для маппирования образов с партициями.
Используются только три файла из дистриба imdisk для каждой разрядности. Никаких следов в системе. Ничего никуда не копируется/не удаляется. Разумеется, только от имени Админа. Никаких проверок в код не вставлял для максимальной облегченности и простоты.
Внимание! Это не программа для пользователей, это код для разработчиков.
---
Если "велосипед", прошу простить покорно.
UPD 1    Внёс изменения в общую структуру: разнёс библиотеку и пример использования (так проще подцепить библиотеку к готовым проектам, например). Мелкие правки шероховатостей, несущественно.
UPD 2    Скрипт переехал сюда.
Attachments


Last edited by Ander_73 on 2019-05-12 14:48; edited 1 time in total

[Quote]

    nikzzzz
  • 215
  • Longevity: 9 years
  • Posts: 3114
  • REPUTATION:127

    [+] [-]
Ander_73, aa
В батнике используется sc.exe - но он есть не во всех сборках, эта проблема обсуждалась в теме по Acronis.
Лучше-бы обойтись без него, например использовать inf файл, ("%SystemRoot%\system32\rundll32.exe" setupapi.dll,InstallHinfSection DefaultInstall 132 imdisk.inf), немного поправив inf файл.
Еще, как вариант, моя утилита, позволяет обойтись без sc.exe и net.exe, писал ее как-раз для подобных целей.

[Quote]

    Ander_73
  • 15549
  • Longevity: 7 years 11 months
  • Posts: 3928
  • REPUTATION:127

    [+] [-]
nikzzzz, aa
Я впервые озаботился различием между sc и net. Твоя утилита ожидает старта/завершения службы (как net) или просто даёт команду (как sc)?

Page 5 of 8


Display posts:    

Current time is: 14-Jan 23:36

All times are UTC + 3


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum