[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

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

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация: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!

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация: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

Предупреждение от nikzzzz


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

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация: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

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

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

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация: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

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

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

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

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

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация: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

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация: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) }

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

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

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

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

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

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


Последний раз редактировалось: Ander_73 (2019-05-12 14:48), всего редактировалось 1 раз

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

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

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

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

Страница 5 из 8


Показать сообщения:    

Текущее время: 29-Мар 16:37

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы