YuS_2
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Victor_VG Цитата: Достал меня их веб установщик. | есть же постоянные ссылки... т.е. можно скрипт сделать почти универсальным. Примерно так: powershell: script.ps1 (кодировка скрипта UTF8 with BOM) Код: # Универсальная функция скачивания и сравнения дат локальных и скачиваемых # файлов по списку из csv-файла (здесь: soft.csv), при помощи службы BITS # идея LevT, # реализация моя (YuS_2) # version 2.0.1 # date 11.05.2020 # изменения: код адаптирован для PS v7.0 # version 1.0.7 # date 22.06.2019 # изменения: поправлен код, изменен способ получения каталога назначения, смещение курсора # version 1.0.5 # date 29.10.2018 # изменения: поправлен код, добавлен вывод лога, добавлены параметры запуска # добавлена возможность скачивания через iwr, при ошибке скачивания BITS [CmdletBinding()] Param( # 1. параметр: Наименование файла со списком софта в формате .csv; возможно переопределение. $file = 'soft.csv', # 2. параметр: 1 или $true во втором параметре запуска - ведение лога; по умолчанию 0 или $false [bool]$log = $false, # 3. параметр: Наименование файла для вывода лога; возможно переопределение. $f_log = 'log.txt', # 4. параметр: Кодировка для логов $encode = 'utf8' ) add-type -ass system.windows.forms if ($pscore = $psversiontable.psversion.major -gt 5){ import-module bitstransfer if ($encode -eq 'utf8'){$encode = 'utf-8'} [net.servicepointmanager]::securityprotocol = 0 } else { [net.servicepointmanager]::securityprotocol = 'ssl3,tls,tls11,tls12' } cls # Перемещаем каретку, чтобы progress-bar не закрывал вывод в консоль. [console]::setcursorposition(0,10) $verbosepreference = "Continue" function Get-Newer { [CmdletBinding()] Param ( # Remote files' URLs [parameter(mandatory=$true, valuefrompipelinebypropertyname=$true)] $source, # Local files' paths [parameter(valuefrompipelinebypropertyname=$true)] $destination ) process{ [array]$script:a += $_.source;[array]$script:b += $_.destination try { $okay,$remotetime = $false,$null if (!(test-path ($d = [io.path]::getdirectoryname($_.destination)))){md $d} $remotetime = if ($pscore){ get-date((iwr $_.source -method 'head' -verbose:$false).headers.'last-modified'[0]) } else {get-date((iwr $_.source -method 'head' -verbose:$false).headers.'last-modified')} $localfile = gi $_.destination -ea stop #если ошибка доступа к файлу или его нет $localtime = $localfile.lastwritetime write-host $('{0:dd.MM.yyyy hh:mm:ss}' -f $remotetime) - $source -for cyan write-host $('{0:dd.MM.yyyy hh:mm:ss}' -f $localtime) - $($localfile.fullname) -for cyan if ($remotetime -ne $localtime){write-host 'not ok' -for red} else {write-host 'ok' -for green} if (($remotetime - $localtime).totalminutes -gt 60){ $okay = $true } else { write-host ("{0} is not newer, skipping" -f $localfile.fullname) -for green } } catch [system.argumentexception] { write-warning 'hohoh' } catch [net.webexception] { write-host $_ -for red write-host $source -for yellow write-host 'Network connection is missing or server is unavailable' -for darkred if ($log){ ("Ошибка $(get-date -f 'dd.MM.yy HH:mm') : {0} - недоступен" -f $source)|out-file $f_log -app -enc $encode } } catch { $okay = $true if(!$remotetime){$remotetime = 'Время изменения недоступно'} } if ($okay){ write-host 'Out remotetime or missing destination file' -for red write-host "remotetime: $('{0:dd.MM.yyyy hh:mm:ss}' -f $remotetime)" -for magenta write-host "Downloading: $($_.source)" -for yellow if ($log){ ("Обновление $(get-date -f 'dd.MM.yy HH:mm') : {0}" -f $_.destination)|out-file $f_log -app -enc $encode } write-output $_ } write-host '=========================================' -for gray } } function get-filednld($webpath,$locpath){ process{ $arr,$cnt,$s=@(),0,-1 $fname = $webpath.split('/')[-1] $job = start-bitstransfer $webpath $locpath -susp -asynch -disp 'Dl_pack' do { if((get-bitstransfer $job.jobid -ea 0).jobstate -eq 'Suspended'){$job.jobid|resume-bitstransfer -asynch|out-null} if((get-bitstransfer $job.jobid -ea 0).jobstate -eq 'Error' -and $webpath -match "^https"){ $job.jobid|suspend-bitstransfer|out-null bitsadmin /SetSecurityFlags (get-bitstransfer $job.jobid -ea 0).displayname 8 |out-null $job.jobid|resume-bitstransfer -asynch|out-null } if((get-bitstransfer $job.jobid -ea 0).jobstate -eq 'Error'){ write-host "ВНИМАНИЕ: $((get-bitstransfer $job.jobid -ea 0).errorcontextdescription) - $((get-bitstransfer $job.jobid -ea 0).errordescription)" -for red if($log){("Ошибка $(get-date -f 'dd.MM.yy HH:mm') : {0}" -f $( "$((get-bitstransfer $job.jobid -ea 0).errorcontextdescription) - $((get-bitstransfer $job.jobid -ea 0).errordescription)") )|out-file $f_log -app -enc $encode} write-host "Попытаемся скачать файл через веб-запрос (iwr)?" -for green #$url = $webpath $btn = [windows.forms.messageboxbuttons]::yesno $que = [windows.forms.messageboxicon]::question $btn1 = [windows.forms.messageboxdefaultbutton]::button1 $top = [windows.forms.messageboxoptions]::servicenotification # .topmost = $true $res = [windows.forms.messagebox]::show($webpath, "Закачать?",$btn,$que,$btn1,$top) if ($res -eq 'Yes'){ iwr $webpath -out $locpath write-host Проверьте закачанный файл $locpath -for yellow if($log){"Произведена попытка скачивания файла через iwr"|out-file $f_log -app -enc $encode} } else { write-host Скачивание пропущенно -for red if($log){"Скачивание через iwr пропущено"|out-file $f_log -app -enc $encode} } $job.jobid|remove-bitstransfer write-progress -act "$fname" -comp } elseif ($cnt -gt 100 -and (get-bitstransfer $job.jobid -ea 0).jobstate -eq 'Connecting' -and (get-bitstransfer $job.jobid -ea 0).bytestransferred -eq 0){ write-host "ВНИМАНИЕ: Возникла ошибка, при скачивании файла $fname` Отсутствует соединение с сервером" -foreg red if($log){("Ошибка $(get-date -f 'dd.MM.yy HH:mm'): {0}" -f ( 'Отсутствует соединение с сервером') )|out-file $f_log -app -enc $encode} $job.jobid|remove-bitstransfer write-progress -act "$fname" -comp } else { $p = [int]((get-bitstransfer $job.jobid -ea 0).bytestransferred/(get-bitstransfer $job.jobid -ea 0).bytestotal*100) $m = if ((get-bitstransfer $job.jobid -ea 0).bytestotal -gt 0){(get-bitstransfer $job.jobid -ea 0).bytestotal/1KB} else {"нет данных"} $sec = if($s -gt 0){$s}else{-1} write-progress -act "Загружается файл $fname" -cur "Путь назначения: $locpath" ` -st ('Размер файла: {0:n0} кб, загружено: {1:p0}, скорость загрузки: {2:n0} кб/с' -f $m,($p/100),$n) -per $p -sec $sec $t1 = get-date; $b1 = (get-bitstransfer $job.jobid -ea 0).bytestransferred sleep 1 $t2 = get-date; $b2 = (get-bitstransfer $job.jobid -ea 0).bytestransferred if($arr.count -gt 25){$arr=$arr[-5..-1]} $arr+=($b2-$b1)/(($t2-$t1).totalseconds)/1024 $n = ($arr|measure -ave).average $s = if($n -ne 0){((get-bitstransfer $job.jobid -ea 0).bytestotal - (get-bitstransfer $job.jobid -ea 0).bytestransferred)/1024/$n}else{-1} } $cnt++ } while ((get-bitstransfer $job.jobid -ea 0).jobstate -and $p -lt 100 -and (get-bitstransfer $job.jobid -ea 0).jobstate -ne 'Transferred') sleep 5 if((get-bitstransfer $job.jobid -ea 0).jobstate -eq 'Transferred'){$job.jobid|complete-bitstransfer;write-progress -act "$fname" -comp} } } (sls $file -patt '^(;|#)' -not -enc $encode).line|convertfrom-csv|get-newer | %{ if($_.source -and $_.destination){get-filednld $_.source $_.destination} } #======Меню запуска установки, только для Adobe Flash Player================= $title = "Запрос установки:" $msg = "Будем устанавливать?" $y = new-object system.management.automation.host.choicedescription "&Y - Да." $n = new-object system.management.automation.host.choicedescription "&N - Нет." $ch = [management.automation.host.choicedescription[]]($y, $n) $res = $host.ui.promptforchoice($title, $msg, $ch, 0) switch ($res){ 0 {write-host -foreg green "Устанавливаем!" for ($i=0;$i -lt $b.length;$i++){ if ($b[$i] -notmatch 'uninstall'){ start-process -file $b[$i] -arg '-install' -wait write-host установлено: $($b[$i]) -for cyan } } write-host -for blue "Готово! Выходим." } 1 {write-host -foreg red "Нет, так нет... выходим."} } | идея и реализация функции отсюда, модификация моя... файл-список(soft.csv, UTF8 with BOM): Код: "Source", "Destination" "https://fpdownload.macromedia.com/pub/flashplayer/latest/help/install_flash_player.exe", ".\soft\install_flash_player.exe" ;"https://download.macromedia.com/pub/flashplayer/latest/help/install_flash_player.exe", ".\soft\install_flash_player.exe" "https://fpdownload.macromedia.com/pub/flashplayer/latest/help/install_flash_player_ppapi.exe", ".\soft\install_flash_player_ppapi.exe" ;"https://download.macromedia.com/pub/flashplayer/latest/help/install_flash_player_ppapi.exe", ".\soft\install_flash_player_ppapi.exe" "https://fpdownload.macromedia.com/pub/flashplayer/latest/help/install_flash_player_ax.exe", ".\soft\install_flash_player_ax.exe" ;"https://download.macromedia.com/pub/flashplayer/latest/help/install_flash_player_ax.exe", ".\soft\install_flash_player_ax.exe" "https://fpdownload.macromedia.com/get/flashplayer/current/support/uninstall_flash_player.exe", ".\soft\uninstall_flash_player.exe" ;"https://download.macromedia.com/get/flashplayer/current/support/uninstall_flash_player.exe", ".\soft\uninstall_flash_player.exe" | скрипт и файл-список положить рядом и запустить... Либо, для совсем ленивых :), пакетный сценарий для запуска: run.bat (кодировка 866) Код: @echo off echo Выполняем... rem powershell -nol -ex bypass .\script.ps1 pwsh .\script.ps1 echo Готово. pause |
| Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 11:57 15-12-2017 | Исправлено: YuS_2, 23:30 11-05-2020 |
|