在PowerShell中同时运行后台任务非常简单,但似乎无法使用新的(在v3中)cmdlet Invoke-WebRequest正常工作。
我正在通过PowerShell以脚本方式下载数千个文件。效果很好,但逐一进行下载需要花费几天时间:
for($f=0;$f -lt $urlList.Count;$f++)
{
$remote = $urlList[$f] + $fileList[$f]
$local = 'C:\folder\' + $fileList[$f]
Invoke-WebRequest $remote -Method Get -OutFile $local -UserAgent FireFox
}
我尝试了几次利用"AsJob"方法,但是要么出现错误,要么完成时没有保存本地文件。这是后者的一个例子:
for($f=0;$f -lt $urlList.Count;$f++)
{
$remote = $urlList[$f] + $fileList[$f]
$local = 'C:\folder\' + $fileList[$f]
$command = "Invoke-WebRequest $remote -Method Get -OutFile $local -UserAgent FireFox"
Start-Job {Invoke-Expression -Command $command}
}
Get-Job|Wait-Job
输出示例:
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
339 Job339 BackgroundJob Running True localhost Invoke-Expression -Com...
341 Job341 BackgroundJob Running True localhost Invoke-Expression -Com...
343 Job343 BackgroundJob Running True localhost Invoke-Expression -Com...
339 Job355 BackgroundJob Completed True localhost Invoke-Expression -Com...
341 Job357 BackgroundJob Completed True localhost Invoke-Expression -Com...
343 Job359 BackgroundJob Completed True localhost Invoke-Expression -Com...
奇怪的是,以上的工作完成所需的时间与下载相关文件的时间几乎相同......因此看起来数据正在流向某个地方——只是没有到达我的保存位置。我猜数据正在进入内存,但在没有保存的情况下被释放了。尝试添加和删除“PassThru”选项,但无论哪种方式都得到相同的结果。还尝试将其管道传输到Out-File,仍无法解决。不确定为什么这个特定的cmdlet如此棘手。