Вызов функции из модуля внутри пространства выполнения

У меня есть несколько функций в модуле, которые я хотел бы вызвать из области выполнения, но они не работают. Я предполагаю, что мне как-то нужно отправить модуль в пространство выполнения.

Пример ниже работает нормально.

$hash = [hashtable]::Synchronized(@{})
$hash.OutData
$runspace = [runspacefactory]::CreateRunspace()
$runspace.Open()
$runspace.SessionStateProxy.SetVariable('Hash',$hash)
$powershell = [powershell]::Create()
$powershell.Runspace = $runspace

$powershell.AddScript({

    $hash.OutData = Get-Date

}) | Out-Null

$handle = $powershell.BeginInvoke()
While (-Not $handle.IsCompleted) {
    Start-Sleep -Milliseconds 100
}

$powershell.EndInvoke($handle)
$runspace.Close()
$powershell.Dispose()

Но если вместо этого я вызываю свою собственную функцию, OutData будет пустым. Функция отлично работает вне рабочего пространства.

$powershell.AddScript({

    $hash.OutData = Get-customData

}) | Out-Null

Что мне нужно сделать, чтобы вызвать мою функцию?


person Jomasdf    schedule 01.03.2021    source источник


Ответы (1)


Если вашего модуля нет в одном из каталогов, перечисленных в $env:PSModulePath (или последняя переменная среды не определена, что может произойти в Unix, если вы размещаете PowerShell SDK во внешнем исполняемом файле), вы должны импортировать его явно:

$yourFullModulePath = '<your-full-module-path-here>'

# Create a default session state and import a module into it.
$iss = [InitialSessionState]::CreateDefault()
$iss.ImportPSModule($yourFullModulePath)

# Create the runspace with the initial session state and open it.
$runspace = [runspacefactory]::CreateRunspace($iss)
$runspace.Open()

# Create a PowerShell instance and assign the runspace to it.
$powershell = [powershell]::Create($runspace)

# ...

Обратите внимание, что вы можете упростить свой код, воспользовавшись тем фактом, что экземпляр [powershell] автоматически создает пространство выполнения:

# Pass the initial session state directly to [powershell]::Create(),
# which automatically provides a runspace.
$powershell = [powershell]::Create($iss)

# Access the [powershell] instance's runspace via the `.Runspace` property.
$powerShell.Runspace.SessionStateProxy.SetVariable('Hash', $hash)

# ...
person mklement0    schedule 01.03.2021