4

在PowerShell中同时运行后台作业非常简单,但我似乎无法使用新的(v3)cmdlet Invoke-WebRequest处理它。在PowerShell v3中运行并行的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是这样一个bug。

回答

4

您需要传递参数,例如他们实际上将其纳入工作中。在V3,你可以使用$使用:语法来做到这一点:

for($f=0;$f -lt $urlList.Count;$f++) 
{ 
    $remote = $urlList[$f] + $fileList[$f] 
    $local = 'C:\folder\' + $fileList[$f] 
    Start-Job {Invoke-WebRequest $using:remote -Method Get -OutFile $using:local -UserAgent FireFox} 
} 
Get-Job|Wait-Job 

BTW,你不需要使用调用-表达。只需将您想要在代码中运行的代码放在scriptblock中,即一组大括号{...}

+0

这很好。这是记录在某处吗?我已经阅读了about_jobs和about_jobs_details手册页,并且看不到任何对$ using:语法的引用 – 2013-03-03 06:56:09

+2

我在$ using中找到了以下信息:[link](http://blogs.msdn.com/b/) PowerShell中/存档/ 2012/06/14 /新V3-语言features.aspx) – jbockle 2013-03-04 03:43:35