使用PowerShell异步下载多个大文件

mmvthczy  于 2023-03-23  发布在  Shell
关注(0)|答案(2)|浏览(194)

我需要下载四个大型操作系统安装介质。如果每次下载完成后才移动到下一个,这将需要很长时间。在下载之前,我想检查介质是否已经存在。
解决方案可能是一个哈希表,测试路径和invoke-webrequest的组合,但我就是不能破解它。
所以在pseudo的一些行上:

Check if file1 exists
if true then download and check file2
if false check file 2
check if file 2 exists...

因此,检查文件是否存在,如果不存在,开始下载所有丢失的文件。
我不是很有经验的PS,所以所有的帮助是非常感谢,非常感谢!研究的答案是有趣的,但我觉得我错过了一个关键字在这里...

hc8w905p

hc8w905p1#

有一个相当简单的方法可以使用WebClient类进行异步下载,尽管它可能在旧版本的PS上不可用。

$files = @(
 @{url = "https://github.com/Microsoft/TypeScript/archive/master.zip"; path = "C:\temp\TS.master.zip"}
 @{url = "https://github.com/Microsoft/calculator/archive/master.zip"; path = "C:\temp\calc.master.zip"}
 @{url="https://github.com/Microsoft/vscode/archive/master.zip"; path = "C:\temp\Vscode.master.zip"}
)

$workers = foreach ($f in $files) { 

$wc = New-Object System.Net.WebClient

Write-Output $wc.DownloadFileTaskAsync($f.url, $f.path)

}

# wait until all files are downloaded
# $workers.Result

# or just check the status and then do something else
$workers | select IsCompleted, Status
5hcedyr0

5hcedyr02#

基于https://blog.ironmansoftware.com/powershell-async-method/中的代码

[void][Reflection.Assembly]::LoadWithPartialName("System.Threading")
function Wait-Task {
    param([Parameter(Mandatory, ValueFromPipeline)][System.Threading.Tasks.Task[]]$Task)
    Begin {$Tasks = @()}
    Process {$Tasks += $Task}
    End {While(-not [System.Threading.Tasks.Task]::WaitAll($Tasks, 200)){};$Tasks.ForEach({$_.GetAwaiter().GetResult()})}
}
Set-Alias -Name await -Value Wait-Task -Force
@(
    (New-Object System.Net.WebClient).DownloadFileTaskAsync("https://github.com/Microsoft/TypeScript/archive/master.zip","$env:TEMP\TS.master.zip")
    (New-Object System.Net.WebClient).DownloadFileTaskAsync("https://github.com/Microsoft/calculator/archive/master.zip","$env:TEMP\calc.master.zip")
    (New-Object System.Net.WebClient).DownloadFileTaskAsync("https://github.com/Microsoft/vscode/archive/master.zip","$env:TEMP\Vscode.master.zip")
) | await

相关问题