所以我刚开始玩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;
我感谢任何帮助。
答案 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) { ...