使用" Invoke-WebRequest"下载多个文件

时间:2018-06-15 23:49:21

标签: powershell

所以我刚开始玩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,它会下载内容两次。

我想要它现在正在做同样的事情,但没有“双重下载”#39;

我感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

您可以使用URL和输出之间的映射创建CSV,然后循环显示:

$csvData = Import-Csv url-and-outputs.csv

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

您的CSV文件需要将第一行作为列名,即" url"和"输出"

答案 1 :(得分:2)

只是发布Charlie答案的替代方法,您还可以使用hash tables来创建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 :(得分: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) { ...