Загрузка Powershell через HTTP с помощью Прокси и Проверяя Удаленные Сбои Размера файла на Втором Файле

У меня есть powershell сценарий, который я разрабатываю, который загрузит файлы с сервера HTTP, проходящего прокси и включая UN/PW на сервере.

У меня есть файлы, загружающие прекрасный, но некоторые файлы являются очень большими, и таким образом, я добавлял функцию, чтобы проверить, изменился ли файл (проверка размера). Это работает над первым файлом. Но это испытывает таймаут на втором файле в этой строке:

$test = $wc2.OpenRead($source) | Out-Null)

Код для моего сценария, исключая учетные данные, упоминается ниже. Я ценил бы совет относительно того, как правильно закрыть соединение (как я подозреваю, не происходит), или о том, как получить размер удаленного файла через использование HTTP Powershell.

Function getWebClient {
    $webClient = new-object System.Net.WebClient 

    $pxy = new-object System.Net.WebProxy $proxy  
    $pxy.Credentials = New-Object System.Net.NetworkCredential ("tnad\$proxy_un", "$proxy_pw") 
    $webClient.proxy=$pxy  
    $webClient.Headers.Add("user-agent", "Windows Powershell WebClient Header") 

    $WebClient.Credentials = New-Object System.Net.Networkcredential($un, $pw)

    return $WebClient
}

foreach ($ds in $datasetsTest) {
    Write-Host "Checking: $ds"
    $source = "$server$ds"
    $dest = "$destFolder$ds"

    #Test whether the destination file already exists, if it exists, compare file sizes.
    $destExists = Test-Path $dest

    if($destExists -eq $false) {
        Try {
            $wc1 = getWebClient
            $wc1.DownloadFile($source, $dest)
            $wc1.Dispose()
            Write-Host "File downloaded"  -foregroundcolor "green"
        } Catch {
            Write-Host "Downloading $ds failed..." -foregroundcolor "red"
        }
    } else {
        $localFileSize = (Get-Item $dest).length
        $wc2 = getWebClient
        $test = $wc2.OpenRead($source) | Out-Null
        $wc2.Dispose()

        $remoteFileSize = $wc2.ResponseHeaders["Content-Length"]

        Write-Host "Local file size: $localFileSize, remote file size: $remoteFileSize"
        if(!($localFileSize -eq $remoteFileSize)) {
            #file exists, but the server version changed...
            Try {
                Remove-Item $dest
                $wc3 = getWebClient
                $wc3.DownloadFile($source, $dest) 
                $wc3.Dispose($true)
                Write-Host "File downloaded"  -foregroundcolor "green"
            } Catch {
                Write-Host "Downloading $ds failed..." -foregroundcolor "red"
            }
        } else {
            Write-Host "Skipping, file exists and hasn't changed"  -foregroundcolor "magenta"
        }
    }
}
5
задан 8 September 2015 в 01:32
2 ответа

Я не могу комментировать эту конкретную проблему как таковую, но я хотел бы предложить некоторые общие рекомендации. За последние несколько лет я написал очень важный код PS, некоторые из которых взаимодействуют с удаленным телеметрическим оборудованием через HTTPS. Этот код должен либо завершиться успешно, либо корректно завершиться с очень подробным ведением журнала. Код, хотя и выполняется на виртуальных машинах Windows, рассматривается как «встроенная система / устройство».

Я искренне рекомендую добавить код обработки ошибок в ваш сценарий. Конечно, в Интернете полно потрясающих примеров кода PowerShell, и каждый последующий шаг предполагает, что предыдущий был успешным. Иногда это усугубляется чрезмерным использованием конвейеров PS, например: enumerate-something | foreach-object {do-something}, где некоторые из действий do-something не работают, а это означает, что вы часто попадаете в невозможную ситуацию отката.

В любом случае, хватит болтовни. Рекомендации:

  1. Включить строгий режим. Это предотвратит любое непреднамеренное приведение / принуждение типов. Предварительно объявите свои переменные с правильными определениями типов.
  2. Используйте -erroraction silentlyContinue, где это возможно, и перехватывайте ошибки с помощью проверки «if ($?)» ... или завершайте вызовы, которые генерируют исключения, с помощью конструкций try {} catch {} . Не все функции PS вызывают исключения!
  3. Запишите много данных журнала
  4. Определите действия, которые с большей вероятностью завершатся ошибкой, и запрограммируйте логику повтора, где это возможно.

Я остановлюсь на этом!

Удачи.

3
ответ дан 3 December 2019 в 01:37

مسئله شما به این دلیل است که متغیر test $ مقدار null اختصاص داده است.

وقتی متغیر $ test

$test = $wc2.OpenRead($source) | Out-Null

را می سازید ، بخش "| Out-Null" نتایج را باطل می کند باعث می شود null به $ test اختصاص یابد ، آن را بردارید و دیگر مشکلی نخواهید داشت.

به عنوان س forال خود در مورد بستن System.Net.WebClient اتصالات: اقدام به پایان شما لازم نیست ، تمام اتصالات HTTP بسته شده است در صورت لزوم و نباید در ایجاد اتصال دوم اختلال ایجاد کند. یک اتصال مداوم باز امکان اتصال به موقع و کارآمدتر را برای اتصالات بعدی به همان URL فراهم می کند. اطلاعات بیشتر در مورد اتصالات ثابت HTTP را می توانید در اینجا بیابید.

2
ответ дан 3 December 2019 в 01:37

Теги

Похожие вопросы