コマンドを使用してダウンロード速度を計算する Windows bat スクリプトがありますping
:
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
ここで、返されるミリ秒の値を区切るためにgetms
多くのコマンドを使用する別の bat があります(言語によって異なります)。for
ping
編集済み: 計算された帯域幅は実際の帯域幅とは関係がなく、ping
転送速度ではなくレイテンシに関係しているので、正しいダウンロード速度に一致するようにスクリプトを編集するにはどうすればよいでしょうか? サードパーティのコマンドではなく、ネイティブ コマンドを使用してこれを行う方法はありますか?
答え1
使用できますビットソフトウェア パッケージをダウンロードします。アイドル状態のネットワーク帯域幅のみを使用するように設計されているため、マシンがすでに何かをダウンロードしている場合はダウンロードが遅くなります。
その後、少し待ってダウンロードの進行状況を監視できます。ダウンロードが遅すぎる場合は、ダウンロードを一時停止またはキャンセルできます。問題がなければ、ダウンロードを完了させます。
BITS を呼び出す最も簡単な方法は PowerShell です。開始するためのコードを以下に示します。
$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)"
}
拡張子を付けてスクリプトを保存しps1
、PowerShell -ExecutionPolicy Unrestricted -File YourScript.ps1
バッチ ファイルから呼び出すために使用します (または直接呼び出します)。