У меня есть 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"
}
}
}
Я не могу комментировать эту конкретную проблему как таковую, но я хотел бы предложить некоторые общие рекомендации. За последние несколько лет я написал очень важный код PS, некоторые из которых взаимодействуют с удаленным телеметрическим оборудованием через HTTPS. Этот код должен либо завершиться успешно, либо корректно завершиться с очень подробным ведением журнала. Код, хотя и выполняется на виртуальных машинах Windows, рассматривается как «встроенная система / устройство».
Я искренне рекомендую добавить код обработки ошибок в ваш сценарий. Конечно, в Интернете полно потрясающих примеров кода PowerShell, и каждый последующий шаг предполагает, что предыдущий был успешным. Иногда это усугубляется чрезмерным использованием конвейеров PS, например: enumerate-something | foreach-object {do-something}, где некоторые из действий do-something не работают, а это означает, что вы часто попадаете в невозможную ситуацию отката.
В любом случае, хватит болтовни. Рекомендации:
Я остановлюсь на этом!
Удачи.
مسئله شما به این دلیل است که متغیر test $ مقدار null اختصاص داده است.
وقتی متغیر $ test
$test = $wc2.OpenRead($source) | Out-Null
را می سازید ، بخش "| Out-Null" نتایج را باطل می کند باعث می شود null به $ test اختصاص یابد ، آن را بردارید و دیگر مشکلی نخواهید داشت.
به عنوان س forال خود در مورد بستن System.Net.WebClient اتصالات: اقدام به پایان شما لازم نیست ، تمام اتصالات HTTP بسته شده است در صورت لزوم و نباید در ایجاد اتصال دوم اختلال ایجاد کند. یک اتصال مداوم باز امکان اتصال به موقع و کارآمدتر را برای اتصالات بعدی به همان URL فراهم می کند. اطلاعات بیشتر در مورد اتصالات ثابت HTTP را می توانید در اینجا بیابید.