Temos um script bat do Windows para calcular a taxa de download através ping
do comando:
SETLOCAL ENABLEDELAYEDEXPANSION
set address=8.8.8.8
set packagesize=65500
set times=20
set accumulator=0
for /l %%a in (1,1,%times%) do (
for /f %%b in ('getms ping -n 1 -l %packagesize% %address%') do (
set /a "accumulator=!accumulator!+%%b"
)
)
set /v "velocity=!packagesize!*!times!/!accumulator!"
echo.!velocity!kbps
onde getms
está outro morcego que usa muitos for
comandos para separar o valor de milissegundo retornado ping
(que varia de acordo com o idioma).
Editado: Bem, como essa largura de banda calculada não está relacionada à largura de banda real, uma vez que ping
está relacionada à latência, não à velocidade de transferência, como posso editar esse script para corresponder à taxa de download correta? Existe alguma maneira de fazer isso com comandos nativos, não com comandos de terceiros?
Responder1
Você pode usarBITSpara baixar seu pacote de software. Ele foi projetado para usar apenas largura de banda de rede ociosa, portanto, o download será lento caso a máquina já esteja baixando algo.
Então você pode esperar um pouco e monitorar o progresso do download. Se estiver muito lento, você pode suspender ou cancelar o download. Se estiver tudo bem, deixe-o concluir.
A maneira mais fácil de invocar o BITS é o PowerShell. Aqui está um código para você começar:
$transfer = Start-BitsTransfer -Asynchronous -Source 'http://mirror.yandex.ru/ubuntu-releases/17.04/ubuntu-17.04-server-i386.iso' -Destination 'c:\Temp'
$bytesTransferred = 0
while($transfer.JobState -eq 'Connecting' -or $transfer.JobState -eq 'Transferring')
{
$delay = 5
Start-Sleep -Seconds $delay
if ($transfer.JobState -eq 'Transferring')
{
$bytesDelta = $transfer.BytesTransferred - $bytesTransferred
$bytesTransferred = $transfer.BytesTransferred
# Check if speed is less than 1 MB/s
if ($bytesDelta -lt (1MB * $delay))
{
Write-Warning 'Download is too slow, aborting'
Remove-BitsTransfer $transfer
# Also can use Suspend-BitsTransfer $transfer to pause and Resume-BitsTransfer $transfer to resume
break
}
}
}
if ($transfer.JobState -eq 'Transferred')
{
Complete-BitsTransfer $transfer
Write-Information 'Download complete'
}
else
{
Write-Error "Download error $($transfer.ErrorDescription)"
}
Salve o script com ps1
extensão e use PowerShell -ExecutionPolicy Unrestricted -File YourScript.ps1
-o para chamá-lo do arquivo em lote (ou apenas chame-o diretamente).