Итак, у меня есть простой скрипт загрузки FTP, который перебирает набор файлов для загрузки. Цикл выбирает файл (отсортированный массив gci), загружает его, а затем переходит к следующему. Всего около 20 файлов. Цикл для одного файла заканчивается, когда либо я получаю сообщение об ошибке от сервера, либо когда я получаю подтверждение от сервера о том, что загрузка выполнена.
В последнее время этот сервер не давал мне ни того, ни другого, разрешая загрузку, но не подтверждая завершение файла. По сути, это означает, что сценарий просто застревает в этом цикле на несколько часов, пока я не отключу сценарий вручную.
Я надеюсь установить тайм-аут для основной команды загрузки, а именно:
$rs = $ftp.GetRequestStream()
$rs.Write($content, 0, $content.Length)
Кажется, что команда записи, хотя файл полностью записан на целевом FTP-сервере, никогда не получает ответа от FTP-сервера, а это означает, что он будет просто зависать, зависать и зависать.
То, что я надеюсь сделать, это добавить тайм-аут. Проблема здесь в том, что я не знаю способа проверить таймеры в середине выполнения задания на запись.
У меня есть выбор здесь?
Вот что я собираюсь сделать, но похоже (мое предположение), поскольку таймеры никогда не сравниваются друг с другом в середине задания на запись, цикл не завершится, пока задание re.write
не завершится (что может быть никогда)
Любые идеи здесь?
$timeout = New-TimeSpan -Seconds 8
$timer = [System.Diagnostics.Stopwatch]::StartNew()
do {
# create the FtpWebRequest and configure it
$ftp = [System.Net.FtpWebRequest]::Create($ftpdestination)
$ftp = [System.Net.FtpWebRequest]$ftp
# build authentication and connection
$ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$ftp.Credentials = new-object System.Net.NetworkCredential($username,$password)
$ftp.UseBinary = $true
$ftp.UsePassive = $true
$ftp.timeout = -1
# read in the file to upload as a byte array
$content = [System.IO.File]::ReadAllBytes($sourcefile)
$ftp.ContentLength = $content.Length
# get the request stream, and write the bytes into it
$rs = $ftp.GetRequestStream()
$rs.Write($content, 0, $content.Length)
$rs.Close()
$rs.Dispose()
}
while ($timer.Elapsed -lt $timeout)
Итак, это то, что я использую, однако я понимаю, что проблема в том, что во время rs.write
(куда уходит все мое время) он не переоценивает уравнение ($timer.Elapsed -lt $timeout
), поэтому он не останавливается. Вот где я застрял.