我有一个我正在开发的PowerShell脚本,它将通过代理服务器上的HTTP服务器下载文件,并在服务器上包含UN / PW。
我有文件下载好,但一些文件是非常大的,所以我一直在添加一个函数来检查文件是否已经改变(检查大小)。 这适用于第一个文件。 但是它在这一行的第二个文件中超时:
$test = $wc2.OpenRead($source) | Out-Null)
下面列出了我的脚本的代码,不包括凭证。 我很感激关于如何正确地closures连接(正如我怀疑没有发生)或如何使用Powershell通过HTTP获取远程文件大小的build议。
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" } } }
我不能评论这个问题本身,但我想提出一些一般性的build议。 过去几年我已经写了一些非常关键的PS代码,其中一些通过HTTPS与远程遥测设备交互。 这个代码要么成功或者失败,要有非常详细的日志logging。 该代码尽pipe在Windows VM中运行,但被视为“embedded式系统/设备”。
我真诚地build议添加error handling代码到您的脚本。 当然,互联网上充满了PowerShell代码的一连串的例子,每一个连续的步骤都假设前一个成功。 有时由于过度使用PSpipe道而使情况变得更糟,例如:enumerate-something | foreach-object {do-something},其中一些do-something失败,意味着你经常处于不可能的回滚状态。
无论如何,喋喋不休。 build议:
我会停在那里!
祝你好运。
你的问题是由于$ testvariables被分配一个空值。
当你build立variables$ test
$test = $wc2.OpenRead($source) | Out-Null
“| Out-Null”部分将结果归零,从而将null分配给$ test,将其删除,并且不应该有问题。
除了closuresSystem.Net.WebClient连接的问题之外,您不需要执行任何操作,所有HTTP连接在需要时都会closures,而且不会影响build立第二个连接。 开放的持久连接将允许在同一个URL的后续连接上进行更及时和有效的连接。 有关持久HTTP连接的更多信息可以在这里find。