Shi*_*hah 5 powershell command-line webclient-download microsoft-bits
我现在有点没钱了...
尝试1
在Powershell中使用iwr。它可以工作,显示进度,但速度慢10倍,直到文件在内存中才刷新:(。
powershell -command "& { iwr https://github.com/mitchellspryn/AirsimHighPolySuv/releases/download/V1.0.0/SUV.zip -OutFile SUV.zip }"
Run Code Online (Sandbox Code Playgroud)
尝试2
在Powershell中使用.Net webclient。它有效,但是没有任何进展,您无法通过Ctrl + C :(。终止。
powershell -command "& { (New-Object System.Net.WebClient).DownloadFile('https://github.com/mitchellspryn/AirsimHighPolySuv/releases/download/V1.0.0/SUV.zip', 'SUV.zip') }"
Run Code Online (Sandbox Code Playgroud)
尝试3
在Powershell中使用BITS传输。它可以工作,显示进度并且几乎完美……直到您发现它神秘地在GitHub上不起作用(错误禁止403)!
powershell -command "& { Start-BitsTransfer -Source https://github.com/mitchellspryn/AirsimHighPolySuv/releases/download/V1.0.0/SUV.zip -Destination SUV.zip }"
Run Code Online (Sandbox Code Playgroud)
小智 7
经过一些研究,我发现@MichaelS的方法最简单,但我添加了一些您可能会觉得有用的修改,例如:
Try/Finally块,因此我们可以处理用户中断 ( Ctrl+ C) 和清理(请参阅Powershell 中的优雅停止)Write-Progress功能,所以感觉更像是Start-BitsTransfer在行动中它看起来像那个 gif。
function Get-FileFromURL {
[CmdletBinding()]
param(
[Parameter(Mandatory, Position = 0)]
[System.Uri]$URL,
[Parameter(Mandatory, Position = 1)]
[string]$Filename
)
process {
try {
$request = [System.Net.HttpWebRequest]::Create($URL)
$request.set_Timeout(5000) # 5 second timeout
$response = $request.GetResponse()
$total_bytes = $response.ContentLength
$response_stream = $response.GetResponseStream()
try {
# 256KB works better on my machine for 1GB and 10GB files
# See https://www.microsoft.com/en-us/research/wp-content/uploads/2004/12/tr-2004-136.pdf
# Cf. https://stackoverflow.com/a/3034155/10504393
$buffer = New-Object -TypeName byte[] -ArgumentList 256KB
$target_stream = [System.IO.File]::Create($Filename)
$timer = New-Object -TypeName timers.timer
$timer.Interval = 1000 # Update progress every second
$timer_event = Register-ObjectEvent -InputObject $timer -EventName Elapsed -Action {
$Global:update_progress = $true
}
$timer.Start()
do {
$count = $response_stream.Read($buffer, 0, $buffer.length)
$target_stream.Write($buffer, 0, $count)
$downloaded_bytes = $downloaded_bytes + $count
if ($Global:update_progress) {
$percent = $downloaded_bytes / $total_bytes
$status = @{
completed = "{0,6:p2} Completed" -f $percent
downloaded = "{0:n0} MB of {1:n0} MB" -f ($downloaded_bytes / 1MB), ($total_bytes / 1MB)
speed = "{0,7:n0} KB/s" -f (($downloaded_bytes - $prev_downloaded_bytes) / 1KB)
eta = "eta {0:hh\:mm\:ss}" -f (New-TimeSpan -Seconds (($total_bytes - $downloaded_bytes) / ($downloaded_bytes - $prev_downloaded_bytes)))
}
$progress_args = @{
Activity = "Downloading $URL"
Status = "$($status.completed) ($($status.downloaded)) $($status.speed) $($status.eta)"
PercentComplete = $percent * 100
}
Write-Progress @progress_args
$prev_downloaded_bytes = $downloaded_bytes
$Global:update_progress = $false
}
} while ($count -gt 0)
}
finally {
if ($timer) { $timer.Stop() }
if ($timer_event) { Unregister-Event -SubscriptionId $timer_event.Id }
if ($target_stream) { $target_stream.Dispose() }
# If file exists and $count is not zero or $null, than script was interrupted by user
if ((Test-Path $Filename) -and $count) { Remove-Item -Path $Filename }
}
}
finally {
if ($response) { $response.Dispose() }
if ($response_stream) { $response_stream.Dispose() }
}
}
}
Run Code Online (Sandbox Code Playgroud)
不确定我最初从哪里得到这段代码,但我已经对其进行了多次修改。希望对你有帮助。
function downloadFile($url, $targetFile)
{
"Downloading $url"
$uri = New-Object "System.Uri" "$url"
$request = [System.Net.HttpWebRequest]::Create($uri)
$request.set_Timeout(15000) #15 second timeout
$response = $request.GetResponse()
$totalLength = [System.Math]::Floor($response.get_ContentLength()/1024)
$responseStream = $response.GetResponseStream()
$targetStream = New-Object -TypeName System.IO.FileStream -ArgumentList $targetFile, Create
$buffer = new-object byte[] 10KB
$count = $responseStream.Read($buffer,0,$buffer.length)
$downloadedBytes = $count
while ($count -gt 0)
{
[System.Console]::CursorLeft = 0
[System.Console]::Write("Downloaded {0}K of {1}K", [System.Math]::Floor($downloadedBytes/1024), $totalLength)
$targetStream.Write($buffer, 0, $count)
$count = $responseStream.Read($buffer,0,$buffer.length)
$downloadedBytes = $downloadedBytes + $count
}
"Finished Download"
$targetStream.Flush()
$targetStream.Close()
$targetStream.Dispose()
$responseStream.Dispose()
}
downloadFile "http://URL_to_your_file" "C:\Path\to\destination.file"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2220 次 |
| 最近记录: |