Powershell Runspace - новый объект не распознан
Учитывая следующее...
- Скрипт Powershell, реализующий пул пространств выполнения
- HashTable именованных блоков скриптов
- Блоки сценариев, которые вызывают New-Object для создания объектов, связанных с SQL (SMO, SqlClient и т. Д.)
Мой сценарий просматривает список серверов и добавляет каждый блок сценария и их параметры из хеш-таблицы в пул пространства выполнения. Некоторые из блоков сценариев вызывают 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 ответ
Думаю, я нашел свою проблему.
Согласно https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators?view=powershell-7, "оператор вызова не анализирует строки. Это означает, что вы не можете используйте параметры команды в строке при использовании оператора вызова ". Приведенный ими пример описывает поведение в моем сценарии.
Короче говоря, нельзя использовать параметры командлета в блоках скриптов, вызываемых с помощью оператора &. Например, что-то вроде &"get-command -Verb 'get'" выдаст ошибку, указывающую, что get-command не может быть найдена.
Прошу прощения за то, что не включил его в свой пример кода.