4

Выполнение одновременных фоновых заданий в PowerShell довольно просто, но я не могу заставить его работать с новым (в v3) командлетом Invoke-WebRequest.Выполнение параллельных заданий Invoke-WebRequest в PowerShell v3

У меня есть несколько тысяч файлов, которые я скачиваю скриптографически через 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, до сих пор не доставляя радости. Не знаю, почему этот конкретный командлет является таким педерастом.

ответ

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 вам не нужно использовать Invoke-Expression. Просто введите код, который вы хотите запустить в задании внутри скриптового блока, т. Е. Набор фигурных скобок {...}.

+0

Это отлично работает. Это где-то документально? Я прочитал и man__bobs и about_jobs_details man-страницы и не вижу ссылки на синтаксис $ using: syntax –

+2

Я нашел эту информацию на $ using: [link] (http://blogs.msdn.com/b/ PowerShell/Архив/2012/06/14/новый-v3-язык features.aspx) – jbockle