2016-10-19 44 views
1

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

Состояние ошибки:

Метод вызов не удалось, потому что [System.Management.Automation.PSRemotingJob] не содержит метод, названный 'op_Addition'. В C: \ Постройте \ AmazingCharts \ Working \ Строительство \ Installer \ WiseInstaller \ Obfusated Projects \ ObfuscateFiles.ps1: 211 полукокса: 13 + $ Jarray + = Start-Job -name ObfuscateFiles $ ScriptBlock - ...
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~
+ CategoryInfo: InvalidOperation: (op_Addition: String) [], Runti
meException + FullyQualifiedErrorId: MethodNotFound

Это говорит о том, что перегруженный оператор + =, по-видимому, не определен, но мне очень сложно поверить, что оператор сложения + = с перегрузкой был бы устаревшим в 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.NET, и моя сборка завершилась неудачно. Еще одно разочарование в том, что выполнение одного и того же файла .ps1 в PowerGUI успешно завершается без ошибок.

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

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

спасибо.


EDIT:

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

Я продолжу обновлять эту область предметами, которые я тестировал.

+0

Вашего кода дан нам является snippet, и он содержит две строки, которые соответствуют этой ошибке, поэтому мы не можем определить, какая из них вызывает исключение (так как номера строк не совпадают). Можете ли вы рассказать нам, является ли это строкой в ​​'if' или' else', которая 'бросает исключение? – briantist

+0

@briantist не должен иметь значения, если он не оставляет что-то между первой строкой и контуром, он должен работать бригадистом –

+0

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

ответ

0

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

Set-ExecutionPolicy Неограниченных & Enable-PSRemoting