【问题标题】:Call function from module inside a runspace从运行空间内的模块调用函数
【发布时间】:2021-03-01 22:06:02
【问题描述】:

我想从运行空间调用的模块中有一些函数,但它不起作用。我假设我必须以某种方式将模块发送到运行空间。

下面的例子很好用。

$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

我需要做什么才能调用我的函数?

【问题讨论】:

    标签: multithreading powershell runspace powershell-module powershell-sdk


    【解决方案1】:

    如果您的模块不在$env:PSModulePath 中列出的目录之一中(或者未定义后一个环境变量,如果您将 PowerShell SDK 托管在外部可执行文件中,这可能在 Unix 上发生),您必须显式导入

    $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)
    
    # ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-04
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 2011-07-11
      相关资源
      最近更新 更多