YuS_2

Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Victor_VG Цитата: Достал меня их веб установщик. | есть же постоянные ссылки... т.е. можно скрипт сделать почти универсальным. Примерно так: powershell: script.ps1 Код: # Универсальная функция скачивания и сравнения дат локальных и находящихся на удаленном сервере # файлов по списку из csv-файла (здесь: soft.csv), при помощи BitsTransfer cls $VerbosePreference = "Continue" function Get-Newer { [CmdletBinding()] Param ( # Remote files' URLs [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true)] $Source, # Local files' paths [Parameter(ValueFromPipelineByPropertyName=$true)] $Destination ) Process{ try { $okay = $false $d = $PSItem.Destination -replace '(.*\\).*','$1' if (!(test-path $d)){md $d} $localfile = $PSItem.Destination | Get-Item -ErrorAction Stop #если ошибка доступа к файлу или его нет [DateTime]$localtime = $localfile.LastWriteTime write-warning "$localtime(localtime) : $($localfile.fullname)" #возможные исключения в .Net методах Create и GetResponse не обработаны [DateTime]$remotetime = get-date((invoke-webrequest $_.Source -method 'head' -verbose:$false).headers.'last-modified') write-warning "$remotetime(remotetime) : $Source" if ($remotetime -ne $localtime){write-warning 'not ok'} else {write-warning 'ok'} if ($remotetime -gt $localtime){ $okay = $true } else { Write-Warning ("{0} is not newer, skipping" -f $localfile.FullName) } } catch [System.ArgumentException] { write-warning 'hohoh' } catch { # обработано только исключение "нет такого локального файла": ошибка доступа провалится сюда же $okay = $true } finally { write-warning '=========================================' } if ($okay){ write-warning "remotetime: $($remotetime.date)" write-warning 'Out remotetime or missing destination file' Write-Verbose ("Downloading: {0}" -f $PSItem.Source) Write-Output $PSItem write-warning '------------------------' } } } function get-filednld($webpath,$locpath){ process{ $arr=@();$cnt=0 $fname = $webpath.split('/')[-1] $job = start-bitstransfer $webpath $locpath -susp -asynch -disp 'Dl_pack' while ($job.jobstate -and $job.jobstate -ne 'Transferred'){ if($job.jobstate -eq 'Suspended'){$job|resume-bitstransfer -asynch|out-null} if($job.jobstate -eq 'Error' -and $webpath -match "^https"){ $job|suspend-bitstransfer|out-null bitsadmin /SetSecurityFlags $job.displayname 8 |out-null $job|resume-bitstransfer -asynch|out-null } if($job.jobstate -eq 'Error'){ write-host "ВНИМАНИЕ: Возникла ошибка, при скачивании файла $fname` $($job.errorcondition) - $($job.errordescription)" -foreg red $job|remove-bitstransfer } elseif($cnt -gt 100 -and $job.jobstate -eq 'Connecting' -and $job.bytestransferred -eq 0){ write-host "ВНИМАНИЕ: Возникла ошибка, при скачивании файла $fname` Отсутствует соединение с сервером" -foreg red $job|remove-bitstransfer } else { $p = $job.bytestransferred/$job.bytestotal*100 write-progress -act "Загружается файл $fname" -cur "Каталог назначения: $locpath" ` -st ('Готово: {0:p0} , скорость - {1:n0} кб/с' -f ($p/100),$n) -per $p $t1 = get-date; $b1 = $job.bytestransferred sleep 1 $t2 = get-date; $b2 = $job.bytestransferred if($arr.count -gt 23){$arr=$arr[-3..-1]} $arr+=($b2-$b1)/(($t2-$t1).seconds)/1024 $n = ($arr|measure -ave).average } $cnt++ } if($job.jobstate -eq 'Transferred'){$job|complete-bitstransfer} } } (sls soft.csv -patt '^(;|#)' -n -enc UTF8).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 "Устанавливаем!" .\soft\install_flash_player.exe -install .\soft\install_flash_player_ax.exe -install .\soft\install_flash_player_ppapi.exe -install write-host -foreg blue "Готово! Выходим." } 1 {write-host -foreg red "Нет, так нет... выходим."} } | идея и реализация функции отсюда, модификация моя... файл-список(soft.csv): Код: скрипт и файл-список положить рядом и запустить... Либо, для совсем ленивых :), пакетный сценарий для запуска: run.bat Код: @echo off echo Выполняем... powershell -nol -ex bypass .\script.ps1 echo Готово. pause |
| Всего записей: 1803 | Зарегистр. 03-02-2009 | Отправлено: 11:57 15-12-2017 | Исправлено: YuS_2, 10:54 17-04-2018 |
|