Powershell Runspace - новый объект не распознан - PullRequest
1 голос
/ 06 августа 2020

Учитывая следующее ...

  1. Сценарий Powershell, который реализует пул пространства выполнения
  2. Хеш-таблица именованных блоков сценариев
  3. Блоки сценариев, которые вызвать New-Object для создания SQL связанных объектов (SMO, SqlClient, et c)

Мой сценарий выполняет итерацию по списку серверов и добавляет каждый блок сценария и их параметры из хэш-таблицы в пул пространства выполнения. Некоторые из блоков сценариев вызывают New-Object для создания экземпляров различных объектов. net.

Код выглядит примерно так (обновлен для более точного отражения проблемы) ...

# add, configure and execute runspace script block
$_ps                = [Powershell]::Create()
$_ps.RunspacePool   = $this._pool

$_script_block = {
   $_obj = New-Object Microsoft.SqlServer.Management.Smo.Server($InstanceName) 
}

$_wrapper_script_block = { &$_script_block }  # returns cmdlet not found error
$_wrapper_script_block = { Invoke-Command -ScriptBlock $_script_block } # works

$null = $_ps.AddScript($_wrapper_script_block)
$null = $_ps.AddParameters($Parms)

# syntax may be off - just for demonstration
[ArrayList] $jobs += @{process = $_ps; handle = $_ps.BeginInvoke()}

Проблема ...

Блоки сценариев возвращают ошибку «Новый объект не распознан ...», если в пуле находится несколько пространств выполнения. Если я использую тот же самый код, но отправляю только один блок сценария, содержащий вызов New-Object (тот же блок сценария не работает с несколькими пространствами выполнения), в пул пространств выполнения, он работает нормально.

Документация Microsoft (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators?view=powershell-7 ) говорит: «Оператор вызова не анализирует строки. Это означает, что вы не можете использовать параметры команды в строке, когда используете оператор вызова». Я перешел с & на Invoke-Command, и, похоже, теперь он работает нормально. Я не совсем уверен, что происходит.

1 Ответ

1 голос
/ 17 августа 2020

Я думаю, что нашел свою проблему.

Согласно https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators?view=powershell-7, «Оператор вызова не анализирует строки. Это означает, что вы не можете использовать параметры команды в строке, когда вы используйте оператор вызова ". Приведенный ими пример описывает поведение в моем сценарии.

Короче говоря, нельзя использовать параметры командлета в блоках сценария, вызываемых с помощью оператора &. Например, что-то вроде & "get-command -Verb 'get'" выдаст ошибку, указывающую, что команда get не найдена.

Прошу прощения за то, что не включил ее в мой пример кода.

...