Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Сценарии для Windows

Модерирует : KLASS, IFkO

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
 
# Универсальная функция скачивания и сравнения дат локальных и скачиваемых
# файлов по списку из 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{
        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}
}
 

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 13:22 16-10-2018 | Исправлено: YuS_2, 23:10 11-05-2020
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Сценарии для Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru