In PowerShell, threads getting executed in separate run spaces. To access variables from the caller scope, you have to use the ‘using’ scope modifier.
function DownloadFiles([string]$WebstoreUrl, [string]$FileList) { Get-Content $FileList | ForEach-Object -Parallel { Invoke-WebRequest "$using:WebstoreUrl/$_" -OutFile $_ } -ThrottleLimit 10 }
For safety reasons, you can’t mutate these variables directly. There is a workaround by assigning it to another variable, but better synchronize the access.
function DownloadFiles([string]$WebstoreUrl, [string]$FileList) { $NoError = $true $SyncObject = [System.Object]::new() Get-Content $FileList | ForEach-Object -Parallel { try { Invoke-WebRequest "$using:WebstoreUrl/$_" -OutFile $_ } catch { [System.Threading.Monitor]::Enter($SyncObject) try { Write-Output "Download error for $using:WebstoreUrl/$_" $NoError = $using:NoError $NoError = $false } finally { [System.Threading.Monitor]::Exit($SyncObject) } } } -ThrottleLimit 10 return $NoError }