使用“Invoke-WebRequest”下载多个文件

3

我刚开始研究PowerShell,想找到一种通过Invoke-WebRequest传递数组的方法,以便下载多个文件。我意识到它只能处理字符串,所以我想了这个解决方案。

$urls = Get-Content .\urls.txt
$outputs = Get-Content .\outputs.txt
foreach ($url in $urls) {foreach ($output in $outputs){Invoke-WebRequest -Uri $url -OutFile $output}}

现在这段代码能够正常工作,但是由于我嵌套了两个foreach,它会下载内容两次。
我希望它能够像现在这样工作,但是不要出现“双倍下载”的情况。
非常感谢您的帮助。
3个回答

3

为了提供一个对Charlie的答案的替代方案,您也可以使用哈希表来创建URL和输出目录之间的关联。这将防止在修改任一 .txt 文件时出现意外结果。实际上,它与CSV解决方案非常相似,但哈希表可以在脚本中维护或基于您两个文本文件的内容生成(从一个文件中获取所有键,从另一个文件中获取所有值)。

$myHash = @{
    'www.url1.com/file.log' = 'c:\temp\output1.log';
    'www.url2.com/file.log' = 'd:\myotherdrive\output.log';
}

ForEach ($file in $myHash.GetEnumerator()) {
    Invoke-WebRequest -Uri $file.Key -OutFile $file.Value
}

2
你可以创建一个CSV文件,其中包含你想要的URL和输出之间的映射关系,然后通过循环遍历该文件来完成操作:
$csvData = Import-Csv url-and-outputs.csv

foreach($row in $csvData){
    Invoke-WebRequest -Uri $row.url -OutFile $row.output
}

您的CSV文件需要顶部行为列名,例如"url"和"output"


非常感谢,这正是我所需要的,保重! - kåre KAEE

2
现有的答案提出了合理的替代方案,以重新组织输入数据,以建立URL和输出文件之间的单一源映射。但是为了回答所提出的问题:
$urls = Get-Content .\urls.txt
$outputs = Get-Content .\outputs.txt

foreach ($i in 0..($urls.Count-1)) {
  Invoke-WebRequest -Uri $urls[$i] -OutFile $outputs[$i]
}
0..($urls.Count-1)创建了一个索引数组,该数组对应于数组$urls的元素,foreach循环迭代变量$i遍历该数组,然后使用它来访问配对的数组元素$urls$outputs
假设创建索引数组在非常高的元素数量方面存在内存使用问题;如果这是一个关注点,请注意PowerShell还支持类似C#的for语句,它更省内存但速度较慢:
for ($i = 0; $i -lt $urls.count; ++$i) { ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接