Ошибка при вызове метода PowerShell

#powershell #cruisecontrol.net

#powershell #cruisecontrol.net

Вопрос:

У меня странная проблема, когда у меня есть существующий код, который работает в Windows 7×86 PowerShell 2.0, но не будет работать в Windows 10×86 с использованием PowerShell 5.0.

Ошибка гласит:

Не удалось вызвать метод, потому что [System.Management.Автоматизация.PSRemotingJob] не содержит метода с именем ‘op_Addition’. В C:BuildAmazingChartsWorkingBuildingInstallerWiseInstallerObfusated Проекты Запутывающие файлы.ps1: 211 символ: 13 $ Jarray = Start-Job -name запутывающие файлы $ScriptBlock — …

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : Недопустимая операция: (op_Addition:String) [], исключение Runti
meException FullyQualifiedErrorId: метод не найден

Это указывает на то, что перегруженный оператор =, похоже, не определен, но мне очень трудно поверить, что перегруженный оператор сложения = устарел в PowerShell 5.0 для массивов.

Кроме того, код, похоже, все еще выполняется и выдает правильный вывод. В моем случае я использую массив заданий для выполнения Red Gate Smart Assembly для обфускации файлов сборки. Ниже приведен фрагмент кода

 $Jarray = @() #initialize jobs array 
foreach ($file in $farray_) {
   $params = $file,$cwd,$bldLog #parameters that are passed to script block
   $nCount = (get-job -state "Running").Count #determines num of running jobs
   if (-not $nCount) {$ncount=0} #initialize variable if null
   if ($nCount -le $MAX_INSTANCES) {
      #The line below is the one that generates the error
      $Jarray  = Start-Job -name ObfuscateFiles $ScriptBlock -ArgumentList $params 
      Start-Sleep -s 1  #gives the system time for process to start
   } else {
      $nCount = (get-job -state "Running").Count 
      if (-not $nCount) {$nCount=0}
      while ($nCount -ge $MAX_INSTANCES) {
         Start-Sleep -s 1  #gives time to recognize the job has started 
         $nCount = (get-job -state "Running").Count
         if (-not $nCount) {$nCount=0}
      }
      $Jarray  = Start-Job -name ObfuscateFiles $ScriptBlock  -ArgumentList $params
   }
} 
  

При этом выполнении он корректно генерирует все запутанные файлы и своевременно, поэтому я знаю, что он создается параллельно до значения MAX_INSTANCES. У меня даже есть код (не включенный выше), который проверяет правильность количества ожидаемых запутанных файлов. Ошибка ‘Вызов метода не удался’ возвращается в CruiseControl.Сбой СЕТИ и моей сборки.
Другое разочарование заключается в том, что выполнение того же файла .ps1 в PowerGUI завершается успешно без каких-либо ошибок.

Я убедился, что мой массив инициализирован. Я пробовал предложения указать, что массив должен иметь тип [PSObject], но я получаю те же результаты.

У кого-нибудь есть идеи, что я могу проверить на это?

Спасибо.


Редактировать:

  • Я тестировал это в среде разработки PowerShell — При тестировании, запущенном из командной строки, я получаю ошибки — При тестировании, запущенном в отладчике, я не получаю ошибок
  • Я проверил тип $ Jarray, и это система.Object[] , чего я и ожидал бы от массива.
  • Я проверил значение $ Jarray во время отладки, и задания создаются, но ошибка все еще сохраняется, как будто она не понимает перегруженный оператор сложения =. Я только предполагаю, что это фиктивная ошибка, маскирующая что-то еще.
  • Я добавил блок try / catch вокруг вызова в $ Jarray. Я пробовал игнорировать ErrorAction, но это не сработало, потому что вызов не знает, что делать с ошибкой. Блок try / catch успешно маскирует ошибку; к счастью, у меня есть другой метод определения того, прошел ли мой вызов успешно. Излишне говорить, что это не «решает» проблему, это только маскирует проблему, потому что прямо сейчас это не критично.

Я продолжу обновлять эту область с помощью протестированных мной функций.

Комментарии:

1. Предоставленный нам код представляет собой фрагмент, содержащий две строки, соответствующие ошибке, поэтому мы не можем определить, какая из них вызывает исключение (поскольку номера строк не совпадают). Можете ли вы сказать нам, является ли строка в if или else это throw исключение?

2. @briantist не должно иметь значения, хотя, если он не пропускает что-то между первой строкой и циклом, это должно сработать

3. брайантист, спасибо за ответ. Я добавил комментарий над строкой, указывающий, какая строка генерирует ошибку.

4. @MathiasR.Jessen Я согласен; но на данный момент я не могу понять ничего другого, и если это одно или другое, возможно, что-то придет к нам!

5. @DanielLee я понял, теперь понимаю, спасибо.

Ответ №1:

Просто идея, но, возможно, захочется убедиться, что на вашем новом компьютере установлена смягченная политика для удаленного доступа И включения сценариев:

Установить-ExecutionPolicy неограниченно и включить-PSRemoting