我有一个脚本,我已经使用了一段时间将备份从服务器传输到FTP位置。
在过去的几个月里它一直没有任何打嗝,但最近互联网连接失败了所以我试图通过添加TRY-CATCH来减轻这对脚本失败的影响阻止重试逻辑。
初始逻辑(有效)是:
$requestStream = $ftp.GetRequestStream()
$fileStream = [System.IO.File]::OpenRead($backup_target_hss)
$chunk = New-Object byte[] $bufSize
$retryCount = 0
while( $bytesRead = $fileStream.Read($chunk,0,$bufsize))
{
$requestStream.write($chunk, 0, $bytesRead)
$requestStream.Flush()
"Flushed: " + $retryCount
}
$FileStream.Close()
$requestStream.Close()
并继续上传文件并正常工作直至结束。
但是在添加了try-catch块后,似乎它会不断跳过通过$requestStream.Write
和$requestStream.Flush()
发送文件:
$requestStream = $ftp.GetRequestStream()
$fileStream = [System.IO.File]::OpenRead($backup_target_hss)
$chunk = New-Object byte[] $bufSize
$retryCount = 0
while( $bytesRead = $fileStream.Read($chunk,0,$bufsize) -and $retryCount -ne 30 )
{
try {
$requestStream.write($chunk, 0, $bytesRead)
$requestStream.Flush()
"Flushed: " + $retryCount
}
catch [Exception] {
Start-Sleep -s 10
$retryCount += 1
"Retry Count " + $retryCount
echo $_.Exception|format-list -force
}
}
$FileStream.Close()
$requestStream.Close()
我这样说是因为两个脚本的打印数量都相同"Flushed"
而且所有消息都是"Flushed 0"
,但TRY-CATCH
版本在5秒内完成,而没有错误处理的版本工作正常。
因为两个脚本只打印"刷新0"这意味着没有跳转到"CATCH"
块,因此$ retryCount变量不会增加,因此"TRY"
完成,没有任何例外。
为什么会出现这种情况以及如何解决这个问题?
更新/澄清:
当我说脚本失败时,我的意思是使用TRY-CATCH时脚本版本的结果是上传到我的FTP的单个1KB
文件,而不是我在#上传的完整2.8GB文件39;我没有使用TRY-CATCH。
在这两种情况下,脚本都会运行而不会抛出错误,但是当使用TRY / CATCH时,它只会更快完成并且实际上并没有完成整个" flush"该文件。