Я пытаюсь передать предварительно созданный объект SmoServer в фоновое задание, чтобы распараллелить некоторые операции с несколькими серверами SQL.Однако, когда я пытаюсь сделать это, дочернее задание вызванного задания застревает в состоянии «NotStarted».Очень простой тест:
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
$SmoServer = New-Object Microsoft.SqlServer.Management.Smo.Server MySqlServer
Start-Job -Name Test -ScriptBlock {
param($SmoServer)
$SmoServer.Databases.Name
} -InitializationScript {
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO"); Import-Module SQLPS -DisableNameChecking
} -ArgumentList $SmoServer
Задание начинается, но ChildJob застревает "NotStarted"
PS C:\Users\omrsafetyo> Get-Job Test
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
5 Test BackgroundJob Running True localhost param($SmoServer) $Smo...
PS C:\Users\omrsafetyo> Get-Job Test | select -expand childjobs
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
6 Job6 NotStarted True localhost param($SmoServer) $Smo...
Я сталкивался с этим некоторое время назад и никогда не нашел решения.А потом я наткнулся на -IntializationScript и подумал, что это может быть серебряная пуля.Кажется, это не так.
То же самое относится и к Invoke-Command.Если я просто запускаю Invoke-Command, команда работает нормально.Однако, если я запускаю Invoke-Command -AsJob и пропускаю объект SmoServer, он все равно не работает.
Как передать эти сложные объекты, для которых требуется сборка / модуль, загруженный в ArgumentList, в фоновое задание?