我有一个正在开发的 powershell 脚本,它将通过代理从 HTTP 服务器下载文件,并在服务器上包含 UN/PW。
我的文件下载正常,但有些文件非常大,所以我一直在添加一个函数来检查文件是否已更改(检查大小)。这适用于第一个文件。但它在这一行的第二个文件上超时:
$test = $wc2.OpenRead($source) | Out-Null)
Run Code Online (Sandbox Code Playgroud)
下面列出了我的脚本的代码(不包括凭据)。我很感激有关如何正确关闭连接(因为我怀疑没有发生)或如何使用 Powershell 通过 HTTP 获取远程文件大小的建议。
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"
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 2
您的问题是由于 $test 变量被分配了空值。
当您构建变量 $test 时
$test = $wc2.OpenRead($source) | Out-Null
Run Code Online (Sandbox Code Playgroud)
“| Out-Null”部分将结果清空,导致 null 被分配给 $test,删除它,您应该不会有问题。
作为关于关闭 System.Net.WebClient 连接的问题的旁白:您不需要执行任何操作,所有 HTTP 连接都会在需要时关闭,并且不应干扰建立第二个连接。开放的持久连接将允许在后续连接到同一 URL 时实现更及时、更高效的连接。有关持久 HTTP 连接的更多信息可以在此处找到。
归档时间: |
|
查看次数: |
3264 次 |
最近记录: |