Считать возвращенные объекты с заданий в powershell? - PullRequest
2 голосов
/ 13 февраля 2020

быстрый вопрос, у меня есть небольшой небольшой скрипт, который создает 2 фоновых задания и проверяет связь с некоторыми веб-сайтами, теперь, так как задания не могут возвращать переменные, по-видимому, я решил попробовать это следующим образом (что, вероятно, является глупым способом сделать это но хорошо) Теперь странная вещь, что это, кажется, работает несколько? Но счетчик, который он возвращает, далеко не тот, который должен быть, он очень случайный, иногда он останавливается на 2, иногда на 3, может кто-нибудь сказать мне, что я делаю неправильно? Не должен ли я в конечном итоге равняться 7? Первоначально я хотел параллельные пространства для пробежек, но уже несколько недель пытаюсь обернуть это вокруг себя и пришел к выводу, что, очевидно, я слишком туп для этого. Возможно ли здесь то, что я пытаюсь сделать?

$1 = @('google.com', 'bing.com', 'yahoo.com', 'startpage.com')
$2 = @('reddit.com', 'facebook.com', 'nonexistent.com')

function run {
  $pwd = Get-Location
  $i = 0

  $list = {
    function list1 ($1, $pwd) {
      foreach ($ping in $1) {
        "&"
        if (Test-Connection -ComputerName $ping -Count 1 -Quiet) {
          "$pwd\" + "$ping"              
        } 
      } 
    }
    function list2 ($2, $pwd) {

      foreach ($ping in $2) {
        "&"
        if (Test-Connection -ComputerName $ping -Count 1 -Quiet) {
          "$pwd\" + "$ping"
        } 
      } 
    }
  }

  echo "ping?`nyes or no`n"; $y = Read-Host
  if ($y -eq 'y') {
    Start-Job -ScriptBlock { list1 $using:1 $using:pwd } -InitializationScript $list
    Start-Job -ScriptBlock { list2 $using:2 $using:pwd } -InitializationScript $list

    While (Get-Job | Where-Object HasMoreData) {
      Get-Job | Where-Object HasMoreData | Receive-Job | Where-Object { $_ -notlike "&" } | Tee-Object -FilePath ping.txt -Append 
      Get-Job | Where-Object HasMoreData | Receive-Job | Where-Object { $_ -like "&" } | Foreach-Object { $i += 1 }
    }
    $i | Add-Content totalcount.txt
  }
}

1 Ответ

1 голос
/ 13 февраля 2020

Исправление к сценарию приведено ниже.

Каждый раз, когда вы используете Receive-Job, он берет данные из потока и отображает их. После его отображения эти данные больше не доступны через Receive-job. Чтобы это исправить, используйте ключ -Keep или сохраните данные, полученные из Receive-Object, в переменную, чтобы использовать ее несколько раз.

if ($y -eq 'y') {
    Start-Job -ScriptBlock { list1 $using:1 $using:pwd } -InitializationScript $list
    Start-Job -ScriptBlock { list2 $using:2 $using:pwd } -InitializationScript $list

    While (Get-Job | Where-Object HasMoreData) {
      Get-Job | Where-Object HasMoreData | Receive-Job -Keep | Where-Object { $_ -notlike "&" } | Tee-Object -FilePath ping.txt -Append 
      Get-Job | Where-Object HasMoreData | Receive-Job | Where-Object { $_ -like "&" } | Foreach-Object { $i += 1 }
    }
    $i | Add-Content totalcount.txt
  }

Однако я бы порекомендовал немного другой маршрут, чем тот, который у вас есть. Вместо того, чтобы получать данные во время проверки, чтобы увидеть, завершено ли задание, запустите l oop и выведите таким образом,

if ($y -eq 'y') {
    Start-Job -ScriptBlock { list1 $using:1 $using:pwd } -InitializationScript $list
    Start-Job -ScriptBlock { list2 $using:2 $using:pwd } -InitializationScript $list

    While ((Get-Job | ? {$_.State -eq "Running" }).Count -gt 0) {
      # wait for all jobs to complete...
      Start-Sleep 1
    }

    #Once all the jobs are done, you can check the results.
    $data = Get-Job | Receive-Job | Where-Object { $_ -notlike "&" } 
    $data | Tee-Object -FilePath ping.txt -Append 
    $data.Count | Add-Content totalcount.txt

    Get-Job | Remove-Job # Dont forget to clean up.

  }
...